栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

(C语言)快速排序法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(C语言)快速排序法

自从笔者开始刷算法题,笔者就发现呐,这个冒泡排序和选择排序是真的很消耗时间,经常会因为超过时间限制而无法ac,于是经过笔者数天的学习,了解到快速排序法是十分高效的,当然相反的,由于快速排序法是通过递归实现,占用的内存会较多.

那么,作为一种排序方法,快速排序法是如何实现的呢?

快速排序法是一种基于分治思想实现的一种排序方法,通过随机定义一个值作为中值,以这个中值为界限划分两个区域,一个是左区域,一个是右区域,比中值大的全部放入右区域 ,比中值小的全部放入左区域,然后继续调用,在左右区域各自在做一次相同的操作,直到排序完成!

哈哈哈,基于文字的学习有时是难以理解滴!所以下面我们来一点实例:

我给定一串数字,希望能逆序排序.

6 7 8 1 4 3 5 2 9

6 7 8 1 4 3 5 2 9

我将6作为我的中值,从最后面逆序开始寻找一个比6小的数,我发现9并不满足我的要求,于是向前一位,因此我就找到了2,将他们两个进行替换.

2 7 8 1 4 3 5 6 9

其实你会发现,此时9作为一个大于6的数已经位于右区域了.

然后我们已经放置了一个数字2进入左区域,此时,我们再从前面顺序找一个比6大的数(这样我就能将6替换回去,进行下一轮的比较),注意,此时我们是从第二位开始找齐,因为数字2已经位于左区域,不必要再次进行比较,然后我们一下子就找到了7(有可能不会一下子找到,小于6的数就会默认直接放入左区域),此时再将7与6进行替换。

2 6 8 1 4 3 5 7 9

然后就再次重复操作(记住,每一次操作的对象是上一次操作对象的前一位(或后一位).

进行最后一轮比较,会出现这种情况

2 5 6 1 4 3 8 7 9

 当我将6与3交换完毕后:

2 5 3 1 4 6 8 7 9

 数字6无法再进行下轮比较,所以这时就停止比较(假设交换前数字3的位置为k,数字6的位置为m,交换完后,数字6的位置变为k,然后进行比较,此时位于m+1,m+2位置(已经强调过,上一次操作的下一个位置进行比较)都比数字6小,于是会最后变成数字6与数字6比较,这时就可以写一个判断语句判断此时位置m+i(跳过的位置数)是否>=k,就可以实现函数终止了。

当这一次函数调用完毕后,我需要将6前面的左区域和后面的右区域分别再进行一次如上操作,即调用函数本身(递归),然后左区域(右区域)排列完毕后,再调用.....直到排序结束,就实现了快速排序了.

以下是实操代码:

void Rapidsort( int s[], int low, int high )
{
    int i = low;    //将第一项定义为low,最后一项定义为high
    int j = high;
    int key = s[low]; //将第一项作为中值
    if (low >= high)  //判断是否处于m+i>=k的位置
    {
        exit(0) ;
    }
    
    while (low < high)   //比较交换
    {
        while (low < high && key <= s[high])
        {
            high++; 
        }
        if (key > s[high])
        { 
            Swap(&s[low], &s[high]);
            low++;
        }
        while (low < high && key >= s[low])
        {
            low++;
        }
        if (key < s[low])
        {
            Swap(&s[low], &s[high]);
            high++;
        }
    }
    Rapidsort(s, i, low-1); 
    Rapidsort(s, low+1, j); //再次调用,左右区域再次排序
}

如果有不对的地方请各位指点出来~~笔者会及时修改~~

swap是交换函数哦~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/511931.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号