排序原理:。
①选定一个值作为分界值,将元素分为大于分界值和小于分界值两部分。
②小于分界值数据放在分界值左边,大于分界值数据放在分界值右边。
③将分界值两边的数据重复寻找分界值分组,直到每组只有两个数据并排序。
切分原理;
①选定一个基准值,用两个指针分别指向数组的首部和尾部。
②先从尾部到头部搜索一个比基准值小的数值,搜索到即停止,并记录其索引。
③再从首部到尾部搜索一个比基准值大的数值,搜索到即停止,并记录其索引。
④交换两个指针的元素。
⑤重复搜索,直到左指针的索引大于等于右指针的索引。
时间复杂度:
最好情况:O(nlogn)
最坏情况:O(n^2)
平均情况:O(nlogn)
空间复杂度:
O(nlogn)
稳定性:
不稳定
实现:
API设计:
①主排序算法用于排序
public static void sort(int[] a)
②对数组从low到high位置的元素进行排序
private static void localSort(int[] a,int low,int high)
③对数组中从索引low到high处的元素按界限值进行分组,并返回界限值的索引。
public static int partition(int[] a,int low,int high)
④ 比较API,用于比较两个元素大小
private static boolean greater(int[] a,int v,int w)
⑤交换API,用于交换两个索引位置的值
private static void exchange(int[] a,int i,int j)
API实现:
//主排序算法用于排序
public static void sort(int[] a) {
int low = 0;
int high = a.length - 1;
localSort(a,low,high);
}
//对数组从low到high位置的元素进行排序
private static void localSort(int[] a,int low,int high){
if(low >= high) {
return;
}
int partition = partition(a,low,high);
//分别让左右分组进行分组有序
localSort(a,low,partition-1);
localSort(a,partition+1,high);
}
//对数组中从索引low到high处的元素按界限值进行分组,并返回界限值位置变换后的索引。
public static int partition(int[] a,int low,int high) {
//1.确定分界值
int key = a[low];
//2.设置两个指针分别指向第一个元素和最后一个元素的下一位置
int left = low;
int right = high +1;
//切分
while(true) {
//先从右向左移动right指针找到一个比key小的数值
while(!greater(a,--right,key)) {
if(right == low) break;
}
//再从左向右移动left指针找到一个比key大的数值
while(!greater(a,++left,key)) {
if(left == high) break;
}
if(left >= right){
break;
}else {
exchange(a,left,right);
}
}
//交换分界值位置
exchange(a,low,right);
return right;
}
//比较API,用于比较两个元素大小
private static boolean greater(int[] a,int v,int w) {
if(a[v]>a[w]) {
return true;
}
return false;
}
//交换API,用于交换两个索引位置的值
private static void exchange(int[] a,int i,int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
网友评论