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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 排序算法之快排,希尔和冒泡 -> 正文阅读

[数据结构与算法]排序算法之快排,希尔和冒泡

????????排序算法有很多种,平常工作其实用到的不多,但是这几种的思想和实现需要了解。而且记起来也不容易混淆。

????????快速排序的特点是,有两个索引去递增和递减,去跟基准比较。通过将基准小的排在前面,基准大的排在后面,递归完成。

int sort(int *data, int left, int right){
    if(left >= right) return 0;

    int i = left;
    int j = right;
    int key = data[i];

    while(i < j){

        //每次大循环内可能同时有i++和j--,如果二层循环不加i < j,可能会导致i > j?(猜想),经测试,不加i < j,结果一样 
        //while(i < j && key < data[j]){
        while(key < data[j]){//后面的值比基准值大就正常移动,一旦碰到比基准值小的就停下
            j--;//从后往前移动
        }
        data[i] = data[j];//将小于基准的值放到前面

        //while(i < j && key >= data[i]){
        while(key >= data[i]){//基准值比前面的值小就正常移动,一旦碰到比基准值大的就停下
            i++;//从前往后移动 
        }
        data[j] = data[i];//将大于基准的值放在后面,j的位置是刚才从后往前移动时小于基准值的位置,已经被挪到前面
    }
    data[j] = key;//当i==j时,循环结束,此时的位置i==j即为基准值应该放置的位置。 

    sort(data, left, i-1);//排列基准位置左边的序列
    sort(data, i+1, right);//排列基准位置右边的序列
}

????????希尔排序的核心思想是分组,然后组内排序。分组的方法类似于,搞团建的时候一个长队伍报数(长度为N),先是1到10(其实是N/2)报数,然后报同一个数字的一组(报1的一组,2的一组……),组内比较。再1到5报数,同样的方式再排序一遍。直到最后1到2报数,这是最后一次组内排序。从这个叙述来看,希尔排序又叫缩小增量排序就很好理解了。

int shell_sort(int *data, int len){

    int gap = 0;//分组跨度
    int i = 0, j = 0;

    for(gap = len / 2; gap >= 1; gap /= 2){ //分组次数的循环

        for(i = gap; i < len; i++){

            int temp = data[i];
            for(j = i - gap; j >=0 && temp < data[j]; j = j - gap){

                data[j+gap] = data[j];

            }

            data[j+gap] = temp;
        }
    }
    return 0;
}

????????最后冒泡排序是最基础的一种,每次比较两个相邻的元素,如果前面的比后面的大,就交换。这里不贴实现,主要是用来做时间复杂度的对比。

排序方法时间复杂度(平均)时间复杂度(最坏)时间复杂度(最好)
冒泡排序O(n2)O(n2)O(n)
希尔排序O(n1.3)O(n2)O(n)
快速排序O(nlog2n)O(n2)O(nlog2n)
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 12:32:05  更:2021-08-13 12:34:36 
 
开发: 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/25 20:29:38-

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