快速排序
来源:互联网 发布:js mouseout 编辑:程序博客网 时间:2024/06/12 21:28
快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
基本思想:
进行一趟排序
1、 要先将待排序列中选一个记录出来作为标准,称为枢纽。
2、 将要排序的数据分割成独立的两部分,其中一部分的所有数据都比枢纽都要小,另一部分比枢纽大。
3、 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
举个例子:将序列(42,30,68,98,86,15,57)进行快速排序
这时即划分完毕,为(15,30),42,(98,86,68,57)
于是经过递归调用后,排序完毕。
原始序列:
(42,30,68,98,86,15,57)
一次划分后:
(15,30),42,(98,86,68,57)
分别对42两边进行快排:
15,(30 结束),42,(57,86,68),98
15,30,42,57,(86,68),98
15,30,42,57,68,86,98 (结束)
代码分析
设置启动函数,即调用qSort(),指定起点为数组起点,终点为数组尾部
void quickSort(int * list, int length)//启动函数,length为数组长度{ qSort(list, 0, length - 1); //指定是整个数组 return;}
qSort()是递归调用函数,参数为数组,以及排序起点,排序终点。通过partition()得到划分位置的枢纽后,如果起点仍小于终点时,递归调用qSort(),对左边和右边进行排序。
void qSort(int * list, int start, int end) //递归调用{ int partpos = partition(list, start, end); //通过调用划分函数,返回枢纽的位置 //枢纽的左边是比枢纽小的数,枢纽的有右边是比枢纽大的数 if (start < end) { qSort(list, start, partpos - 1); //对枢纽左边的数调用qSort进行递归调用进行排序 qSort(list, partpos + 1, end); //对枢纽右边的数调用qSort进行递归调用进行排序 } return;}
partition() 是对数组的划分,然后返回枢纽位置。把第一个记录拿出来作为枢纽,将low指向待排记录的第一个记录,high指向最后一个记录。首先将high所指的位置先前移动,直到找到第一个比枢纽关键字小的记录并将其复制至low所指的位置。然后将low所指的位置先后移动,直到找到第一个比枢纽关键字大的记录并将其复制至high所指的位置。如此反复交替移动位标high和low,直至low和high 相等,将枢纽复制至low所指的位置。
int partition(int * list, int low, int high) //一次划分{ int temp = list[low]; //将list[low]作为枢纽,存到temp中 while (low < high) //要时刻保证low<high { while (low < high && list[high] > temp) //当list[high]的数大于temp时,high指针往下指 //相当于保证比枢纽小的数一直在前面,后面都为比枢纽大的数据 { high--; } list[low] = list[high]; //如果list[high]<temp时,跳出循环,把这个数放到前面枢纽的位置 while (low < high && list[low] < temp) //当list[low]的数小于temp时,low指针往上指 //相当于保证比枢纽大的数放在后面,前面都为比枢纽小的数据 { low++; } list[high] = list[low]; //此时list[low]的数比枢纽大,将这个数后移至list[high]处 } list[low] = temp; //把枢纽放在low位上,这时前面的数据比枢纽小,后面的数据比枢纽大 return low; //返回枢纽的位置}
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- PHP内核--探究内存管理与缓存机制
- php被遗忘的一些功能强大的字符串处理函数
- 定制Hibernate的PropertyAccessor实现XML的反序列化
- android:常用权限
- JQuery 的几个简单实现示例
- 快速排序
- 2016/10/23
- Linux -- 进程间通信之信号量
- struts2文件上传突破2M大小限制的问题
- 自考宏观回顾
- Linux C/C++ 内存泄漏检测工具:Valgrind
- C语言习题
- Canada Cup 2016-D. Contest Balloons(优先队列)
- Swift 3 新特性