目录

  • 希尔排序
  • 堆排序
  • 快速排序

希尔排序

【问题描述】给出一组数据,请用希尔排序将其按照从小到大的顺序排列好。

【输入形式】原始数据,以0作为输入的结束;第二行是增量的值,都只有3个。

【输出形式】每一趟增量排序后的结果

【样例输入】

8 3 6 1 68 12 19 3 1 0

5 3 1

【样例输出】

8 3 3 1 68 12 19 6 1
1 3 1 8 6 3 19 68 12
1 1 3 3 6 8 12 19 68

【样例输入】

5 3 9 8 2 4 1 7 10 6 0

4 2 1

【样例输出】

2 3 1 7 5 4 9 8 10 6
1 3 2 4 5 6 9 7 10 8
1 2 3 4 5 6 7 8 9 10

#include<iostream>
using namespace std;void ShellSort(int a[], int ick, int limit)
{int i, j;for(i = ick; i < limit; i ++){int temp = a[i];for(j = i - ick; j >= 0 && temp < a[j]; j -= ick){a[j + ick] = a[j];}a[j + ick] = temp;}for(i = 0; i < limit; i ++){cout<<a[i]<<" ";}cout<<endl;
}
int main()
{int a[50];int cnt = 0;for(cnt = 0; ;cnt ++){cin>>a[cnt];if(a[cnt] == 0) break;}int ick[10];int i = 0;while(cin>>ick[i]){i ++;}int j = 0;while(1){ShellSort(a, ick[j], cnt); //cnt取不到j ++;if(j == i) break;}return 0;
}

堆排序

【问题描述】请用堆排序的方法对一组数据进行排序,并给出建堆以及每一趟堆排序的结果。
【输入形式】一组数据,以0作为输入的结束。
【输出形式】建大根堆的结果,以及每一趟堆排序的结果。
【样例输入】

8 3 6 1 68 12 0

【样例输出】

68 8 12 1 3 6
12 8 6 1 3 68
8 3 6 1 12 68
6 3 1 8 12 68
3 1 6 8 12 68
1 3 6 8 12 68

【样例输入】

12 9 26 11 38 52 99 27 66 15 32 0

【样例输出】

99 66 52 27 38 12 26 9 11 15 32
66 38 52 27 32 12 26 9 11 15 99
52 38 26 27 32 12 15 9 11 66 99
38 32 26 27 11 12 15 9 52 66 99
32 27 26 9 11 12 15 38 52 66 99
27 15 26 9 11 12 32 38 52 66 99
26 15 12 9 11 27 32 38 52 66 99
15 11 12 9 26 27 32 38 52 66 99
12 11 9 15 26 27 32 38 52 66 99
11 9 12 15 26 27 32 38 52 66 99
9 11 12 15 26 27 32 38 52 66 99

#include<iostream>
using namespace std;int a[30];
int limit = 0; //limit为数组最后一个元素下标void Sift(int pos, int edge = limit)
{while(1){if(2 * pos + 2 <= edge){if(a[pos] > a[2 * pos + 1] && a[pos] > a[2 * pos + 2])break;if(a[pos * 2 + 1] < a[pos * 2 + 2]){swap(a[pos], a[pos * 2 + 2]);pos = pos * 2 + 2;continue;}else{swap(a[pos], a[pos * 2 + 1]);pos = pos * 2 + 1;continue;}}else if(2 * pos + 1 <= edge){if(a[pos] < a[pos * 2 + 1]){swap(a[pos], a[pos * 2 + 1]);pos = pos * 2 + 1;continue;}}if(2 * pos + 2 > edge ) break;}
}void HeapSort() //堆排序,limit可取,建立大根堆
{//建堆时,要将数据初始化成一个大根堆int i = 0;for(i = (limit - 1) / 2; i >= 0; i --) //初次建堆{if(i * 2 + 2 <= limit){if(a[i] < a[i * 2 + 1] || a[i] < a[i * 2 + 2]){if(a[i * 2 + 1] < a[i * 2 + 2]){swap(a[i], a[i * 2 + 2]);Sift(i * 2 + 2);}else{swap(a[i], a[i * 2 + 1]);Sift(i * 2 + 1);}}}else if(i * 2 + 1 <= limit){if(a[i] < a[i * 2 + 1]){swap(a[i], a[i * 2 + 1]);Sift(i * 2 + 1);}}}for(i  = 0; i <= limit; i ++) //输出第一次建堆后的结果{cout<<a[i]<<" ";}cout<<endl;for(i = limit; i > 0; i --){swap(a[i], a[0]);Sift(0, i - 1);int j;for(j = 0; j <= limit; j ++){cout<<a[j]<<" ";}cout<<endl;}
}
int main()
{int i = 0;for(i = 0; ; i ++){cin>>a[i];if(a[i] == 0)break;}limit = i - 1;HeapSort();return 0;
}

快速排序

【问题描述】输入一组数据,以0作为输入的结束,分别采用冒泡排序、选择排序、快速排序的方法,对其进行从小到大的排序,给出排序后的结果。

【输入形式】一组数据,以0作为输入的结束

【输出形式】三种排序后的结果

【样例输入】

9 8 4 5 7 2 10 6 0
【样例输出】

2 4 5 6 7 8 9 10

2 4 5 6 7 8 9 10

2 4 5 6 7 8 9 10

#include<iostream>
using namespace std;void PopSort(int a[], int limit)
{int i, j;for(i = limit - 1; i > 0; i --) //i 从最后一个元素取{int flag = 1;for(j = 0; j < i; j ++) //j只能取到i的前一位,因为还有j + 1{if(a[j] > a[j + 1]){int temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;flag = 0;}}if(flag) break;}for(i = 0; i < limit; i ++){cout<<a[i]<<" ";}cout<<endl;
}void QSort(int a[], int left, int right, int limit)
{while(left < right) //中间轴值就是a[left]{while(left < right && a[left] <= a[right]){right --;}swap(a[left], a[right]); // 轴值换成了a[right]while(left < right && a[left] <= a[right]){left ++;}swap(a[left], a[right]);}int i = 0;for(i = 0; i <limit; i ++){cout<<a[i]<<" ";}cout<<endl;
}void SelectSort(int a[], int limit)
{int i, j, k;for(i = 0; i < limit - 1; i ++){k = i;for(j = i + 1; j < limit; j ++){if(a[j] < a[k])k = j;}if(k != i)swap(a[i], a[k]);}for(i = 0; i < limit; i ++){cout<<a[i]<<" ";}cout<<endl;
}int main()
{int limit = 0;int a[20];for(limit = 0; ; limit ++){cin>>a[limit];if(a[limit] == 0) break;}PopSort(a, limit);SelectSort(a, limit);QSort(a, 0, limit - 1, limit);return 0;
}

数据结构第16周 :( 希尔排序+ 堆排序 + 快速排序 )相关推荐

  1. 下列各排序法中,最坏情况下的时间复杂度最低的是(**C** )A.希尔排序 B.快速排序 C.堆排序 D.冒泡排序

    下列各排序法中,最坏情况下的时间复杂度最低的是(C ) 希尔排序 A.快速排序 B.堆排序 C.冒泡排序 D.正确答案:C 题目解析: 堆排序最坏情况时间下的时间复杂度为 O(nlog2n) :希尔排 ...

  2. 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序

    这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,需要的朋友可以参考下 本文实现了八个常用的排序算法:插入排序 ...

  3. 希尔排序、快速排序、归并排序的实现分析以及时间复杂度

    高级排序 希尔排序 快速排序 归并排序 希尔排序 希尔排序是插入排序的一种,又称"缩小增量排序",是插入排序算法的一种更高效的改进版本. 我在另一篇文章中说插入排序的时候,会有一个 ...

  4. 数据结构与算法之希尔排序

    数据结构与算法之希尔排序 目录 希尔排序介绍 希尔排序法的示意图 代码实现 1. 希尔排序介绍 简单插入排序存在的问题:当然需要插入的数是较小的数时,后移的次数明显增加,对效率有影响. 希尔排序法介绍 ...

  5. 算法---排序--希尔排序和快速排序

    冒泡.选择.插入排序算法是三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大,那么这三种简单的排序所需要的时间则是我们所不能接受的.接着我们在讲解递 ...

  6. JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序)

    JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序) 一. 大O表示法 在进行排序算法之前,我们得先掌握一种对算法效率的表示方法,大O表示法. 我们使用大O表示法来表示算法的时间复杂 ...

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

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

  8. 数据结构上机实验-希尔排序,快速排序,堆排序

    1.希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名. ...

  9. 数据结构:直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排序

    一.什么是排序 排序就是将一组杂乱无章的数据按照一定的次序组织起来,此次序可以是升序也可以是降序 二.为什么需要进行排序 为了满足一些需求,比如在比较学生的成绩时,我们就需要给所有学生的成绩排一个顺序 ...

最新文章

  1. 内网渗透-2019/06/06
  2. MW150UH驱动程序Linux,水星MW150UH无线网卡驱动
  3. 笔记-信息系统开发基础-信息系统规划方法-大型新信息系统特征/企业系统规划步骤...
  4. music‘s effects
  5. jQuery的Autocomplete插件的远程url取json数据的问题
  6. 基于HTML5手机上下滑动翻页特效
  7. LINUX学习笔记共五部分
  8. oracle 如何终止存储过程的运行
  9. 修复版ZFAKA发卡系统源码 自适应PC+手机端
  10. java 图形 登录_Java图形界面——登录框
  11. 勤于思考:Asp.Net MVC Html.TextBoxFor日期格式化
  12. 基于粒子群优化深度核极限学习机的故障诊断方法
  13. Chrome去广告插件-Adblock Plus
  14. ZZULIOJ--2825: 收集金币
  15. 【论文研读】基于对偶种群的约束多目标优化进化算法
  16. 腾讯php二面,【更新】腾讯实习生招聘后台开发面试一面+二面+HR面
  17. python换脸开源_Python实现AI换脸功能
  18. oracle 拉里 网线通道,拉里.埃里森:Oracle云计算服务进入超速增长阶段
  19. 电阻(电阻器)学习干货
  20. 稳定软件研发团队组织结构

热门文章

  1. echarts 地图tooltip提示框超出浏览器窗口怎么隐藏?
  2. Redhat联网及配置网络yum
  3. uCosII移植STM32F407教程
  4. sql server 2019安装及登录失败问题回头看
  5. [转贴]空间数据建库的大致过程
  6. [附源码]java毕业设计生产型企业员工管理系统
  7. CorelDRAW大全集及按键技巧
  8. 温度传感器种类及工作原理
  9. java finally 抛出异常_java的异常处理机制(try catch finally)
  10. php laravel框架开发实例,Laravel框架集合用法实例浅析