三个基本排序问题的实现,先给出几个公用的比较函数、元素交换函数和显示函数。

#include <iostream>
using namespace std;#define ElementType charbool lessFunc(ElementType cur, ElementType ref)   //比较函数
{return cur < ref;
}
void exch(ElementType a[], int curIndex, int refIndex)  //交换函数
{ElementType tmp;tmp = a[curIndex];a[curIndex] = a[refIndex];a[refIndex] = tmp;
}
void showFunc(ElementType a[], int N)
{for (int i = 0; i < N; i++)cout << a[i] << ' ';cout << '\n';
}

一、选择排序

原理:首先找到数组中最小的那个元素,其次将它和数组中的第一个元素交换位置;再次,在剩下的元素中找到最小的元素,将它与数组中的第二个元素交换位置。如此往复,直到将整个数组排序。

void ChooseSort(ElementType a[],int N)
{for (int i = 0; i < N; ++i){int minIndex = i;for (int j = i + 1; j < N; ++j)if (lessFunc(a[j], a[minIndex])) minIndex = j;exch(a, i, minIndex);}
}
int main()
{ElementType a[] = "SORTEXAMPLE";int len = strlen(a);   //当数组作为函数参数传递时,数组名代表的是数组的首址,而非数组内容,故无法使用sizeof和strlen;cout << "Raw Seq:\n";showFunc(a, len);cout << "Sorted Seq:\n";ChooseSort(a, len);showFunc(a, len);cin.get();return 0;
}

二、插入排序

将元素逐个插入,索引左侧的所有元素都是有序的,但它们 的最终位置还不确定,为了给更小元素腾出空间,它们可能会被移动。当索引到达数组右端时,数组排序就完成了。

void InsertSort(ElementType a[], int n)
{for (int i = 1; i < n; ++i){for (int j = i; j >0 && lessfunc(a[j],a[j-1]); j--){exch(a,j,j-1);}}
}int main()
{ElementType a[] = "SORTEXAMPLE";int len = strlen(a);   //当数组作为函数参数传递时,数组名代表的是数组的首址,而非数组内容,故无法使用sizeof和strlen;cout << "Raw Seq:\n";showFunc(a, len);cout << "Sorted Seq:\n";InsertSort(a, len);showFunc(a, len);cin.get();return 0;
}

为了提高插入排序的速度,可以在内循环中将较大的元素都向右移动而总是交换两个元素。因为while循环可以提前终止,故访问数组的平均次数减半。

void InsertSort(ElementType a[], int N)
{for (int i = 1; i < N; ++i){ElementType tmp = a[i];int j = i;  //j表示当前待排序元素while (j>0 && lessFunc(tmp,a[j-1]))   //将当前元素依次与左侧元素比较;将比a[i]大的元素右移一位,同时得到a[i]的位置j。{a[j] = a[j - 1];j--;}a[j] = tmp;}
}

三、希尔排序

基于插入排序的快速的排序算法。希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。

图解:https://www.cnblogs.com/chengxiao/p/6104371.html

void ShellSort(ElementType a[], int n)
{//递增序列int h = 1;while (h<n/3){h = 3 * h + 1;}//排序 将数组变为h有序while (h>=1){for (int i = h; i < n; i++){   //将a[i]插入到a[i-h],a[i-2*h],a[i-3*h]...中for (int j = i; j >= h && lessFunc(a[j], a[j - h]); j -= h)exch(a,j,j-h);}h = h / 3;}
}int main()
{ElementType a[] = "SORTEXAMPLE";int len = strlen(a);   //当数组作为函数参数传递时,数组名代表的是数组的首址,而非数组内容,故无法使用sizeof和strlen;cout << "Raw Seq:\n";showFunc(a, len);cout << "Sorted Seq:\n";ShellSort(a, len);showFunc(a, len);cin.get();return 0;
}

基本排序方法实现:选择排序、插入排序、希尔排序相关推荐

  1. 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...

    掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等). 数组高级以及Arrays(掌握) 排序方法 空间复杂度 时间复杂度 稳定性 插 入 排 序 ...

  2. 直接插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序的算法分析和具体实现 ...

    排序分为内部排序和外部排序 内部排序是把待排数据元素全部调入内存中进行的排序. 外部排序是因数量太大,把数据元素分批导入内存,排好序后再分批导出到磁盘和磁带外存介质上的排序方法. 比较排序算法优劣的标 ...

  3. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  4. 【八大排序详解~C语言版】直接插入排序-希尔排序- 直接选择排序-堆排序-冒泡排序-快速排序-归并排序-计数排序

    八大排序 1.直接插入排序 2.希尔排序 3.直接选择排序 直接选择排序改进 4.堆排序 1.建堆 2.利用堆删除思想来进行排序 5.冒泡排序 6.快速排序 递归实现 非递归实现 7.归并排序 递归实 ...

  5. 七大排序算法—图文详解(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)

    作者:渴望力量的土狗 博客主页:渴望力量的土狗的博客主页 专栏:数据结构与算法 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客网 点击免费注册和我一起刷题吧 目录 插入排序: ...

  6. 【排序算法】冒泡排序|选择排序|插入排序|希尔排序

    文章目录 冒泡排序 选择排序 插入排序 希尔排序 冒泡排序   第一个元素开始向第二个元素比较,若大于则交换位置,不大于则不动.然后第二个元素和第三个元素比较,再然后第三个元素和第四个元素比较-一直比 ...

  7. 插入排序 希尔排序 C++

    最优时间复杂度为o(n),又称缩小增量排序. 逻辑分析: 1.希尔排序首先是确定增量,默认的希尔增量(不一定是最优)为length/2. 2.根据增量分组,将分组的元素利用直接插入法排序. 3.增量= ...

  8. 插入排序(折半查找优化插入排序||希尔排序) _清风明月

    插入排序:插入排序分为三个步骤: 1. 找位置.(序列可分为两个部分,第一个部分是有序序列,其二是非有序序列.当为有序序列时,查找可以改进为折半查找,优化算法速度.) 2. 移动. 3. 插入.查找的 ...

  9. 希尔排序增量怎么确定_Python实现希尔排序(已编程实现)

    希尔排序: 观察一下"插入排序":其实不难发现她有个缺点: 如果当数据是"5, 4, 3, 2, 1"的时候,此时我们将"无序块"中的记录插 ...

  10. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

最新文章

  1. ae编程语言as_AE开发 入门教程
  2. OpenSSL简介及在Windows、Linux、Mac系统上的编译步骤
  3. Android --- Retrofit 之 Okhttp3 网络请求总是调用 onFailure 方法,而不调用 onResponse,报错 timeout。
  4. leetcode 492. 构造矩形(Java版,三种解法)
  5. 这次使用一个最舒服的姿势插入HttpClient拦截器技能点
  6. Linux下串口ttyS2,ttyS3不能用的问题解决办法
  7. 【数据库实验课堂】实验三:管理SQL Server表数据
  8. vi/vim 键盘图
  9. 漫游Kafka实战篇clientAPI
  10. python爬取58同城二手房信息
  11. asm磁盘头全部损坏数据0丢失恢复----惜分飞
  12. linux搭建dlna媒体服务器,Serviio:一款功能强大的DLNA媒体服务器软件
  13. 理解神经网络:神经元的概念
  14. 英雄联盟3月17日服务器维护,英雄联盟将于3月17日凌晨2点开始进行全区停机维护...
  15. 如何从0到开始写短视频剧本,轻轻松松获得百万点赞
  16. 要「自我颠覆」的华为Mate 10来了
  17. 如何将图片存进SQL数据库中以及从数据库读取照片(解决办法)
  18. location选择收货地址
  19. 小强升职记(GTD)脑图
  20. Jetson设备下使用docker报错的排错过程完整记录,failed to create shim: OCI runtime create failed: container_linux.go:38

热门文章

  1. 空间滤波_空间频率 、 光波方向 与 空间滤波 4f系统
  2. android关闭人脸检测功能,【Android知识】录像预览模式下打开人脸检测
  3. oracle 10g 扩表空间,Oracle 10g 表空间管理(一)
  4. oracle 11g regexp_substr,oracle中REGEXP_SUBSTR方法的使用
  5. 农业大学计算机论文,农业大学毕业论文范文
  6. Python+OpenCV:摄像机标定(Camera Calibration)
  7. Halcon PDF文档(hdevelop_users_guide)学习总结之七——关于Halcon语法
  8. 【带着canvas去流浪】 (3)绘制饼图
  9. Excel控件 Spire.XLS系列教程(2):C# 设置现有 Excel 图表的数据标签样式
  10. 改动文件后缀的C语言实现