快速排序:
1、取要排序的数组的第一个值(可有其它选择)作为比较值,记为k;
2、将要排序的数组的第一个值的索引记为 i,最后一个值的索引记为 j;
3、从 j 开始倒序遍历和比较的基准值 k 做比较,如果 j >= k;则 j--;如果 j<k; 将数组中索引为 j 的值赋值给数组中 i 的位置然后 i++ ;
4、从 i 开始顺序遍历和比较的基准值 k 做比较,如果 i < k; 则 i++ ; 如果 i > k; 将数组中索引为 i 的值赋值给数组中 j 的位置然后 j--;
5、重复 3、4的操作,直到 i == j结束循环,将比较基准值 k 放到数组的 i 位置中;
6、完成5之后 基准值 k 所在的位置 i 将原数组分成了两份,i 位置之前的值均小于 k ,i 位置之后的值均大于等于 k ,再将这两个数组进行上述1~5的操作,一直分割直到无法再分割(每个数组中只有一个元素);
代码如下:
private static int num =0;//循环次数
public static int[] quickSort(int[] forSort,int start,int end){
if(start < end){
int k = forSort[start];
int i = start;
int j = end;
while(i<j){
while(i<j && forSort[j]>k){
num++;
j--;
}
if(i<j){
forSort[i] = forSort[j];
i++;
}
while(i<j && forSort[i] < k){
num++;
i++;
}
if(i < j){
forSort[j] = forSort[i];
j--;
}
}
forSort[i] = k;
System.out.println("分次结果:"+Arrays.toString(forSort)+";i="+i+";j="+j);
Quicksort.quickSort(forSort,start,i-1);
/*递归调用,把key后面的完成排序*/
Quicksort.quickSort(forSort,i+1,end);
}
return forSort;
}
public static void main(String[] args) {
int[] array = {2,5,6,8,5,4,6,9,4,9};
int[] sorts = Quicksort.quickSort(array, 0, array.length-1);
System.out.println("最终结果:"+Arrays.toString(sorts)+",num="+num);
}
}
结果
分次结果:[2, 5, 6, 8, 5, 4, 6, 9, 4, 9];i=0;j=0
分次结果:[2, 4, 4, 5, 5, 8, 6, 9, 6, 9];i=4;j=4
分次结果:[2, 4, 4, 5, 5, 8, 6, 9, 6, 9];i=2;j=2
分次结果:[2, 4, 4, 5, 5, 6, 6, 8, 9, 9];i=7;j=7
分次结果:[2, 4, 4, 5, 5, 6, 6, 8, 9, 9];i=6;j=6
分次结果:[2, 4, 4, 5, 5, 6, 6, 8, 9, 9];i=9;j=9
最终结果:[2, 4, 4, 5, 5, 6, 6, 8, 9, 9],num=15