IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> (C语言)快速排序法 -> 正文阅读

[数据结构与算法](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是交换函数哦~

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 19:05:28  更:2021-11-16 19:07:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:25:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码