算法 -- 排序(归并、快速)

目录

参考链接

一、归并排序(Merge Sort)

二、快速排序(quick sort)


参考链接

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;
}

发布了35 篇原创文章 · 获赞 22 · 访问量 1142

猜你喜欢

转载自blog.csdn.net/m0_37845735/article/details/103396124