快速排序的认识
2017-07-21 15:58
162 查看
[align=center]认识快速排序
[/align]
概述:
快速排序是冒泡排序的升级,都属于交换类排序
简介:
快速排序是一种非常高效的排序算法。
它的实现,增大了记录的比较和移动的距离。将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少总的比较次数和移动次数,同时采用“分而治之”的思想。把大的拆分为小的,小的拆分为更小的。
操作:
对于给定的一组记录,选择一个基准元素,通常选择第一个元素和最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分,直到序列中所有的记录有序为止。
示例:
排序 4为基准
4 5 6 7 8 9 3 5
第一次(注意,开始比较的时候,方位都是从最后一个元素开始,当发起交换的时候,比较需要改变方位。)
4 5 6 7 8 9 35 (5比4大,移动指针,序列不变)
||
4 5 6 7 8 93 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 55( 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 87 (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]
[/align]
概述:
快速排序是冒泡排序的升级,都属于交换类排序
简介:
快速排序是一种非常高效的排序算法。
它的实现,增大了记录的比较和移动的距离。将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少总的比较次数和移动次数,同时采用“分而治之”的思想。把大的拆分为小的,小的拆分为更小的。
操作:
对于给定的一组记录,选择一个基准元素,通常选择第一个元素和最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分,直到序列中所有的记录有序为止。
示例:
排序 4为基准
4 5 6 7 8 9 3 5
第一次(注意,开始比较的时候,方位都是从最后一个元素开始,当发起交换的时候,比较需要改变方位。)
4 5 6 7 8 9 35 (5比4大,移动指针,序列不变)
||
4 5 6 7 8 93 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 55( 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 87 (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]
相关文章推荐
- 简单的C语言快速排序实现代码
- java实现七种排序 (插入排序, 希尔排序, 插入排序, 快速排序, 简单选择排序, 堆排序, 归并排序)
- 215. Kth Largest Element in an Array 暴力-堆排序-快速排序
- 《算法导论》笔记 第7章 7.3快速排序的随机化版本
- 快速排序 冒泡排序 归并排序 堆排序 的主要代码
- 快速排序,冒泡排序,插入排序 完整示例
- python 3.2 实现快速排序 源代码
- 算法之快速排序
- 快速排序
- C/C++ qsort()快速排序的用法
- 快速排序
- 排序算法:快速排序
- Java/Go实现——快速排序
- 算法初级02——荷兰国旗问题、随机快速排序、堆排序
- Java排序算法:快速排序
- 七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)
- 快速排序
- 冒泡排序与快速排序
- 快速排序及快速选择
- 快速排序