1、引
- 冒泡排序有他有缺点,它是相临的两个元素之间的交换,效率比较低,对于数据比较多的排序显然是不行的。快速排序是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。
2、基本思想
- 快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
考虑如下数组:
9,3,6,5,7,4
第一步:
- 先一个pivot,这个pivot可以随便选,可以定一个算法 pivot = array[n/2],取中间的数
pivot = 5;
第二步:
- 从左长比pivot大的数,从右找比pivot 小的数
从左找到9,从右找到 4
第三步:
- 将第二步找到的两个数交换
4,3,6,5,7,9
第四步:
- 再找下一个满足 第二步条件的数据,一直到左右的下标相等,本轮交换结束。
一轮交换后:
4,3,5,6,7,9
第五步:
- 第四步完成后,左下标以左的数据都比pivot小,以右的数据都比pivot大,这样就把一个无序的数组分成了两部分。
– 4,3,5,这一边的数据都比5小(等于);
– 6,7,9 ,这一边的数据都比5大;
第六步:
- 对分割的两部分又重新从第一步开始,递归调用。
3、C语言实现
void quick_sort( int *array, int n)
{
int left, right, pivot, tmp;
if (n < 2) return; //递归退出的条件
pivot = array[n / 2]; //取中间的数为基准
for ( left = 0, right = n -1;; left++, right--)
{
//从左边开始找大于pivot的数
while (array[left] < pivot)
left++;
//从右边开始找小于pivot的数
while (pivot < array[right])
right--;
if ( left >= right) //本轮交换结束了
break;
//交换
tmp = array[left];
array[left] = array[right];
array[right] = tmp;
}
quick_sort(array, left); //对左边的排序
quick_sort(array + left, n - left);//对右边的排序
}
4、总结
- 分治
- 递归
- 交换
5、参考
https://www.youtube.com/watch?v=SLauY6PpjW4
http://developer.51cto.com/art/201403/430986.htmyc