认识快速排序
概述:
快速排序是冒泡排序的升级,都属于交换类排序
简介:
快速排序是一种非常高效的排序算法。
它的实现,增大了记录的比较和移动的距离。将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少总的比较次数和移动次数,同时采用“分而治之”的思想。把大的拆分为小的,小的拆分为更小的。
操作:
对于给定的一组记录,选择一个基准元素,通常选择第一个元素和最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分,直到序列中所有的记录有序为止。
示例:
排序 4为基准4 5 6 7 8 9 3 5
第一次(注意,开始比较的时候,方位都是从最后一个元素开始,当发起交换的时候,比较需要改变方位。)
4 5 6 7 8 9 3 5 (5比4大,移动指针,序列不变)||4 5 6 7 8 9 3 5 (3 比4小,3发起交换,且对面移动指针)||3 5 6 7 8 9 4 5 (5比4 大,5发起交换,且对面移动指针)||3 4 6 7 8 9 5 5 (9 比4大,移动指针,序列不变)||3 4 6 7 8 9 5 5 (8比4大,移动指针,序列不变)||3 4 6 7 8 9 5 5 (7比4大,移动指针,序列不变)||3 4 6 7 8 9 5 5 (6比4大,移动指针,序列不变)第一次结束分为两部分i-1,i+1( 4所在的数组序号为1,所以i=1)分为两部分{3}和{6 7 8 9 5 5}{3 4}不必排序下面需要第二次排序,排{6 7 8 9 5 5},以 6为基准发起第二次排序6 7 8 9 5 5( 5比6小,5 发起交换,对面移动指针)||5 7 8 9 5 6 ( 7比6大,7 发起交换,对面移动指针)||5 6 8 9 5 7 ( 5 比6 小,5发起交换,对面移动指针)||5 5 8 9 6 7 (8比6 大,8发起交换,对面移动指针)||5 5 6 9 8 7 (9比6 大,移动指针)||5 5 6 9 8 7第二次排序结束发起第三次排序分为两部分 {5 5 }和{ 9 8 7}{5 5}不必排序下面排序{ 9 8 7 } ,以9为基准9 8 7 (7 小于9 ,7发起交换,对面移动指针)||7 8 9(排序结束,据此,可以很快写出代码)
代码:
public static void resultK(int[] a,int low,int high){
int i=low;
int j=high;
if(low>=high){
return ;
}
int index=a[i];
int temp=0;
while (i < j) {
while(j>i&&a[j]>=index){//先从后面开始算
j--;
}
if(i<j){
temp=a[i];
a[i++]=a[j];//先将a[j]的值赋给a[i],然后i自增1。
a[j]=temp;
}
while(i<j&&a[i]<index){
i++;
}
if(i<j){
temp=a[j];
a[j--]=a[i];
a[i]=temp;
}
}
resultK(a,low,i-1);
resultK(a,i+1,high);
}
测试以及结果:
int[] a= {4, 5, 6, 7, 8, 9, 3, 5};
paiXu.resultK(a,0,a.length-1);
System.out.println(Arrays.toString(a));
打印:[3, 4, 5, 5, 6, 7, 8, 9]