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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 快速排序的两种方法 -> 正文阅读

[数据结构与算法]快速排序的两种方法

1.左右指针法

思路:

1.选出一个pivot,一般是最左边或者最右边

2.定义一个start和end,start从左往右走,end从右往左走(需要注意的是:若选择最左边的数据作为pivot,则需要end先走;若选择最右边的数据作为pivot,则需要start先走)

3.在走的过程中,若是end遇到了小于pivot的数,就停下。然后start开始走,若是遇到了大于pivot的数时,这个时候交换start和end的值。如此循环下去直到start和end相遇,然后将相遇点的数和pivot交换即可。(选取最左边的值为pivot)

4.这个时候pivot左边的数都是小于等于pivot的数,pivot右边的数都是大于等于pivot的数。(第3步相遇的数可以和pivot交换的原因是因为end总是比start先走,所以最后相遇的数一定是小于等于pivot的)

5.将pivot的左序列和右序列再次进行这种单趟排序,如此反复操作下去,直到左右序列只有一个数据,或是左右序列不存在时,便停止操作,此时此部分已有序

c++代码如下:

void QuikSort(vector<int> &nums,int start,int end)
{
    //只有一个数或者区间不存在
    if(start>=end)
    {
        return;
    }
    int left=start;
    int right=end;
    //选左边为pivot
    int pivot=start;
    while(start<end)
    {
         //右边选小        
         while(start<end&&nums[end]>=nums[pivot])
         {
             --end; 
         } 
         //左边选大
         while(start<end&&nums[start]<=nums[pivot])
         {
             ++start;
         }
         //交换
         swap(nums[start],nums[end]);
    }
    //将相遇点的内容与pivot交换
    swap(nums[end],nums[pivot]);
    //pivot指向end
    pivot=end;
    //递归排序
    QuikSort(nums,left,pivot-1);
    QuikSort(nums,pivot+1,right);
}

2.挖坑法

思路:
挖坑法思路与hoare版本(左右指针法)思路类似
1.选出一个数据(一般是最左边或是最右边的)存放在key变量中,在该数据位置形成一个坑
2、还是定义一个L和一个R,L从左向右走,R从右向左走。(若在最左边挖坑,则需要R先走;若在最右边挖坑,则需要L先走)

c++代码如下:

void QuikSort(vector<int> &nums,int start,int end)
{
    //只有一个数或者区间不存在
    if(start>=end)
    {
        return;
    }
    int left=start;
    int right=end;
    //选取左边为key
    int key=nums[start];
    while(start<end)
    {
        //右边选小
        while(start<end&&nums[end]>=key)
        {
            --end;
        }
        //小的放在左边的坑里
        nums[start]=nums[end]
        //左边选大
        while(start<end&&nums[start]<=key)
        {
            ++start;
        }
        //大的放在右边的坑里
        nums[end]=nums[start];
    }
    //把key的值放入相遇的坑位
    nums[begin]=key;
    //相遇的点左右两边继续排序
    int pivot=begin;
    QuikSort(nums,left,pivot-1);
    QuikSort(nums,pivot+1,right);
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 16:12:59  更:2021-12-14 16:15:26 
 
开发: 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 16:31:46-

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