目录
参考链接
https://blog.csdn.net/MoreWindows/article/details/6684558#commentBox
https://blog.csdn.net/insistgogo/article/details/7785038
一、归并排序(Merge Sort)
如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。归并排序使用的就是分治思想,可以用递归来实现。分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了
递推公式:merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r))
终止条件:p >= r 不用再继续分解
二、快速排序(quick sort)
如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot,后面的 q+1 到 r 之间是大于 pivot 的
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
概括来说为 挖坑填数+分治法
根据分治、递归的处理思想,我们可以用递归排序下标从 p 到 q-1 之间的数据和下标从 q+1 到 r 之间的数据,直到区间缩小为 1,就说明所有的数据都有序了。
递推公式: quick_sort(p…r) = quick_sort(p…q-1) + quick_sort(q+1… r)
终止条件: p >= r
/**
* quick sort.
*
* @param array:
* @return -1:array is null or num <= 1
* 0:success
*/
int quick_sort(int *array, int l, int r)
{
int i = l, j = r, x = array[l];//区间内的第一个坑
//分治
if(l < r)
{
int i = l, j = r, x = array[l];//区间内的第一个坑
while(i < j)
{
while (i < j && array[j] >= x) j--;//从右向左找小于x的数填array[i]
if (i < j) array[i++] = array[j];
while (i < j && array[i] < x) i++;//从左往右找大于x的数填array[j]
if (i < j) array[j--] = array[i];
}
array[i] = x;//i等于j的时候退出,将选取的基准填到最后一个坑上
quick_sort(array, l, i-1);//递归调用
quick_sort(array, i+1, r);
}
return 0;
}