【数据结构8】排序

简介: 0 各种排序的比较1 内部排序1-1 插入型排序1-1-1 直接插入排序1-1-2 折半插入排序1-1-3 希尔shell排序1-2 交换型排序1-2-1 简单冒泡排序1-2-2 高级冒泡排序1-2-3 快速排序1-3 选择型排序...

0、 各种排序的比较

内部算法 时间复杂度(最好) 时间复杂度(评价) 时间复杂度(最坏) 空间复杂度 是否稳定 备注
直接插入排序 O(n) O(n^2) O(n^2) O(1) n<50,默认有序为佳
简单冒泡排序 O(n) O(n^2) O(n^2) O(1) n<50,默认有序为佳
简单选择排序 O(n^2) O(n^2) O(n^2) O(1) n<50,元素信息量小为佳
希尔shell排序 O(n^1.3) O(n^1.3) O(n^1.3) O(1)
快速排序 O(n*log(n)) O(n*log(n)) O(n^2) O(log(n)) 适用n大,元素随机分布最佳
堆排序 O(n*log(n)) O(n*log(n))) O(n*log(n)) O(1) 适用n大
二路归并排序 O(n*log(n)) O(n*log(n)) O(n*log(n)) O(n) 适用n大
基数排序 O(d(n+r)) O(d(n+r)) O(d(n+r)), O(rd) O(r) n大且关键字位少

1、 内部排序

1-1 插入型排序

1-1-1 直接插入排序

#include <stdio.h>

void insert_simple(int a[], int n){
        int i, j;
        for(i = 2; i <= n;i++)
                if(a[i] < a[i-1]){
                        a[0] = a[i];
                        for(j = i-1; a[0] < a[j]; j--)
                                a[j+1] = a[j];
                        a[j+1] = a[0];
                }
}

int main()
{
        int n, data[]={-99999,4,5,2,-4,5,0,9}; // the first is sentinel.
        n = sizeof(data)/sizeof(int) - 1;
        insert_simple(data,n);
        for(int i = 1; i <= n; i++)printf("%d ", data[i]);
        return 0;
}

1-1-2 折半插入排序

#include <stdio.h>

void insert_half(int a[], int n){
        int i, j, low, high, mid;
        for(i = 2; i <= n;i++){
                a[0] = a[i];
                low = 1, high = i-1;
                while(low <= high){
                        mid = (low + high) / 2;
                        if(a[mid] > a[0]) high = mid - 1;
                        else low = mid + 1;
                }
                for(j = i-1; j >= high + 1; j--) a[j+1] = a[j];
                a[high+1] = a[0];
        }
}

int main()
{
        int n, data[]={-99999,4,5,2,-4,5,0,9}; // the first is sentinel.
        n = sizeof(data)/sizeof(int) - 1;
        insert_half(data,n);
        for(int i = 1; i <= n; i++)printf("%d ", data[i]);
        return 0;
}

1-1-3 希尔shell排序

1-2 交换型排序

1-2-1 简单冒泡排序

1-2-2 高级冒泡排序

1-2-3 快速排序

  • 《数据结构》C语言版 严蔚敏教材的方法(交换最少)

这里写图片描述
这里写图片描述

  • 《算法》第4版 Robert Sedgewick and Kevin Wayne的方法(最直观)

这里写图片描述
这里写图片描述

  • 《算法导论》第3版 Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein的方法

这里写图片描述

这里写图片描述

1-3 选择型排序

1-3-1 简单选择排序

1-3-2 堆排序

1-4 归并排序

1-4-2 二路归并排序

1-5 基数排序

2、 外部排序

2-1 多路归并排序

Wu_Being 博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《【数据结构8】排序》
http://blog.csdn.net/u014134180/article/details/55506271

Wu_Being 吴兵博客接受赞助费二维码

如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。

目录
相关文章
|
9月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》图、查找、排序专题考点(含解析)
408考研——《数据结构》图,查找和排序专题考点选择题汇总(含解析)。
332 29
|
10月前
|
存储 人工智能 算法
【C++数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】
本关任务是实现二路归并算法,即将两个有序数组合并为一个有序数组。主要内容包括: - **任务描述**:实现二路归并算法。 - **相关知识**: - 二路归并算法的基本概念。 - 算法步骤:通过比较两个有序数组的元素,依次将较小的元素放入新数组中。 - 代码示例(以 C++ 为例)。 - 时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 - **测试说明**:平台会对你编写的代码进行测试,提供输入和输出示例。 - **通关代码**:提供了完整的 C++ 实现代码。 - **测试结果**:展示代码运行后的排序结果。 开始你的任务吧,祝你成功!
234 10
|
10月前
|
搜索推荐 算法 数据处理
【C++数据结构——内排序】希尔排序(头歌实践教学平台习题)【合集】
本文介绍了希尔排序算法的实现及相关知识。主要内容包括: - **任务描述**:实现希尔排序算法。 - **相关知识**: - 排序算法基础概念,如稳定性。 - 插入排序的基本思想和步骤。 - 间隔序列(增量序列)的概念及其在希尔排序中的应用。 - 算法的时间复杂度和空间复杂度分析。 - 代码实现技巧,如循环嵌套和索引计算。 - **测试说明**:提供了测试输入和输出示例,帮助验证代码正确性。 - **我的通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了代码运行的测试结果。 通过这些内容,读者可以全面了解希尔排序的原理和实现方法。
161 10
|
10月前
|
搜索推荐 C++
【C++数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
快速排序是一种高效的排序算法,基于分治策略。它的主要思想是通过选择一个基准元素(pivot),将数组划分成两部分。一部分的元素都小于等于基准元素,另一部分的元素都大于等于基准元素。然后对这两部分分别进行排序,最终使整个数组有序。(第一行是元素个数,第二行是待排序的原始关键字数据。本关任务:实现快速排序算法。开始你的任务吧,祝你成功!
225 7
|
搜索推荐 C++
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理(一)
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理
147 5
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
197 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
129 1
|
搜索推荐 索引
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理(二)
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理
143 4
|
算法
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序

热门文章

最新文章

下一篇
开通oss服务