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

[数据结构与算法]LY的数据结构复习———快速排序

一种上课老师讲了没听懂的排序方法(

快排快排,可以说是相当的快了。具体实现的话弄懂也十分简单:

拿一个数组举例:

a [] = {5,7,4,6,3,1,2,9,8}

?那么我们取第一个元素,将比它小的放在它的右边,将比他大的放在他的左边,即可得到:

那么怎么放有讲究嘛,这里我的写法是:

定义两个指针(两个数),一个指向数组开始,一个指向数组末尾

先将第一个元素也就是5拿出来:

那么这时第一个位置会产生一个空缺,拿谁来补,从后往前遍历,找到第一个比5小的数来补。

即数组末尾指针向前移动,找到比5小的数停止,并将该位置的数放到数组开头:

这时候右边又会产生一个空缺,拿谁补,从左边遍历,找到第一个比5大的数放在内个位置即可。

即开头的指针向后移动,找到比5大的数停止,并将该位置的数放到数组末尾指针的位置。

下一次又到从末尾指针开始找,找到后赋值给头指针,如此循环往复,知道两个指针碰头:

?

?

?

?这时我们将之前提出的5放在碰头的位置:

ok,这一小步算是完成了。只要搞定这一步,剩下的就十分的简单了。

此时我们将数组分成了两个部分,即比五小和比五大,我们只需要利用递归的方式让左边的部分和右边的部分分别重复上述的过程即可。每一边结束的条件是只有一个元素或者无元素。

具体实现代码(菜鸡码风,轻喷:

#include<iostream>
using namespace std;

int p(int a[],int left,int right)   //分左右两部的函数
{
    int temp =a[left];        //将第一个元素取出,不一定为0,如果后面递归时就是最左
    while(left<right)
    {
        while(left<right&&a[right]>=temp) //末尾指针向前找
            right--;
        a[left]=a[right];
        while (left<right&&a[left]<=temp)  //头指针向后找
            left++;
        a[right]=a[left];      
    }
    a[left]=temp;     //将之前的元素放入指针碰头位置
    return left;        //返回碰头位置下标
}

void quick_sort(int a[],int left, int right)  //快排本体
{
    int mid = p(a,left,right);        //找到这部分的中间位置
    if(left<right)                        //只要至少有两个元素就能排
    {
        quick_sort(a,mid+1,right);
        quick_sort(a,left,mid-1);
    }

} 


int main()
{
    int a[] = {5,7,4,6,3,1,2,9,8};
    
    quick_sort(a,0,sizeof(a)/sizeof(int)-1);
    for(int i = 0 ;i<sizeof(a)/sizeof(int);i++)
    {
        cout<<a[i];
    }


}

?成功得到输出:

说完了算法,下面来考察时间复杂度(平均):

用一种不严谨的算法来算十分简单:

如果一个数组有8个元素,那么我们找一个元素可以将它分成两部分——左边4个右边4个(强调不严谨算法)继续分:

除去一开始的一共分了3层即log8层这么多,那么每层运算都要左指针从左遍历,右指针从右遍历,将这个数组完全遍历一遍也就是进行了8次访问。

这样看来快排的复杂度也显而易见了为O(nlogn)

相较于冒泡的n方而言快了不少,但同样存在最坏情况,如果我们采用上述办法来对一个逆序数组进行顺序排序的话,时间复杂度一样会来到O(n方),各位同学们可以自行模拟一下。

解决办法十分简单,即开始时在数组中随机选择一个数,让它与第一个数进行换位,继续上述方法即可,这样来做就无法刻意构建出一个最坏情况,从而大大提高此算法的稳定性。?

?

?

?

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:33:23  更:2021-11-29 16:34:14 
 
开发: 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 12:26:18-

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