<1>选择排序

void chooseSort(int *array, int count) {
//第一轮找到数组中最小的放在数组第一个位置
//第二轮除过第一个元素之外,在剩下的元素中找到第二小的放在数组的第二个位置
//第三轮除过前两个元素之外,在剩下的元素中找到第三小的放在数组的第三个位置
//以此类推int index;int i = 0;int j = 0;int temp; for (i = 0; i < count - 1; i++)  {for(index = i, j = i; j < count; j++) {//设每一轮的第一个元素为当前最小元素,则最小元素的小标为iif (array[index] > array[j]) {//自己先和自己进行比较,再和之后的元素进行比较index = j;    }   }//如果index == i 则表示这一轮中最小的元素就是本轮第一个//如果本身数组中的数据按照升序排列,那么每一轮的最小元素的下标就是本轮的第一个元素的下标//此时的if语句里边的操作将不会在进行,时间复杂度可以减少3nif (index != i) { //此判断表示找到的最小元素的下标不是每轮一开始设定的最小值的下标,temp = array[index];array[index] = array[i];array[i] = temp;}}}

<2> 插入排序


void insertSort(int *array, int count) {int index;int i = 0;int temp;int j;for (index = 1; index < count; index++) {//将index对应的值与index之前的下标进行相比较进行插入定位//再进行移动temp = array[index];for(i = 0; i < index && temp > array[i]; i++) {//进行比较定位 //当条件为temp > array[i]的时候,如果有两个相同的数字,排列完之后总是之前的顺序逆序出现//当条件为temp >= array[i]的时候,如果有两个相同的数字,排列完之后按之前的顺序出现}for (j = index; j > i; j--) {array[j] = array[j - 1];}array[i] = temp;}}

<3>冒泡排序


void swapSort(int *array, int count) {int i = 0;int j = 0;int temp;boolean exchange = FALSE;for (i = 0; i < count; count--) {for (j = 0, exchange = FALSE; j < count - 1; j++) {if (array[j] > array[j + 1]) {temp = array[j + 1];array[j + 1] = array[j];array[j] = temp; exchange = TRUE;   }}if (exchange == FALSE) {break;   }}}

<4>希尔排序


void stepInsertSort(int *array, int count, int i, int step) {int index;int temp;int j = 0;int k = 0;for (index = i + step; index < count; index += step) {temp = array[index];for (j = i; j < index && temp > array[j]; j += step) {}for (k = index; k > j; k -= step) {array[k] = array[k - step];}array[j] = temp;}
}void shellSort(int *array, int count) {int step;int i = 0;for (step = count / 2; step > 0; step /= 2) {//每一次的step的变化都要做一次整体的每一组交换for (i = 0; i < step; i++) {stepInsertSort(array, count, i, step);//插入排序,只不过不是挨个向后取元素进行定位移动,而是选取每隔step个的元素进行处理   }  }
}

<5>堆排序


void heapOnce(int *array, int count, int root) {int leftIndex;int rightIndex;int maxIndex;int temp;while(root < count / 2) {//保证了只有非叶子节点才有左右孩子temp = array[root];leftIndex = 2 * root + 1;rightIndex = 2 * root + 2;if (rightIndex >= count) {//表明没有右孩子,maxIndex = leftIndex;} else {//左右孩子中选出最大值对应的下标,另一边的根堆保持不变if (array[rightIndex] > array[leftIndex]) {maxIndex = rightIndex;} else {maxIndex = leftIndex;}}if (temp < array[maxIndex]) {//根据大小比较交换位置array[root] = array[maxIndex];array[maxIndex] = temp;root = maxIndex;} else {return;}}}void heapSort(int *array, int count) {int temp;int i;for (i = count / 2 - 1; i > 0; i--) {//先整体做一次大根堆处理,以后只需要处理根节点就行heapOnce(array, count, i);}while (count > 1) {heapOnce(array, count, 0);//最后一层的大根堆处理,以后每次只需要进行根节点的调整//交换根节点和最后一个节点的位置temp = array[0];array[0] = array[count - 1];array[count - 1] = temp;count--;  }}

<6> 快速排序


int quickOnce(int *array, int head, int tail) {int temp = array[head];while (head < tail) {while (head < tail && array[tail] > temp) {--tail;}if(head < tail) {//采用if做判断,避免是原本是升序的情况下,tail一直--,只到head与tail相等//此时并不需要做交换,只有在head < tail的情况下才需要作交换array[head++] = array[tail];}while (head < tail && array[head] < temp) {++head;}if (head < tail) {array[tail--] = array[head];}}array[head] = temp;return head;}void  quickDG(int *array, int head, int tail) {int middle;if (head >= tail) {return;}middle = quickOnce(array, head, tail);quickDG(array, head, middle - 1);quickDG(array, middle + 1, tail);
}void quickSort(int *array, int count) {quickDG(array, 0, count - 1);}

3大类6种排序 插入排序 选择排序 冒泡排序 希尔排序 堆排序 快速排序 —————— 开开开山怪相关推荐

  1. 希尔排序大详解,保证10分钟内学会希尔排序(进化版插入排序)

    希尔排序 核心思想是化远为近: 1.使查找次数减少 2.从而移动元素的次数减少 文章目录 希尔排序 动画引入 一.希尔排序的代码(两个函数实现) 二.希尔排序(一个函数实现) 总结 动画引入 提示:颜 ...

  2. 四种排序:选择,插入,冒泡,快速排序原理及其对应的时间、空间复杂度解析

    四种排序:选择,插入,冒泡,快速排序原理及其对应的时间空间复杂度 首先,在了解四种排序之前,让我们来了解一下什么是时间复杂度和空间复杂度. 时间复杂度:算法的时间复杂度是一个函数,它定性描述该算法的运 ...

  3. 排序上---(排序概念,常见排序算法,直接插入,希尔排序,直接选择排序,堆排序)

    排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对 ...

  4. 【数据结构----笔记5】插入排序算法之【希尔排序算法】

    /*__________________________________________________________________________________________________ ...

  5. [ 数据结构 -- 手撕排序算法第三篇 ] 希尔排序

    手撕排序算法系列之:希尔排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算法:排序算 ...

  6. 希尔排序法。Java实现希尔排序

    前言基础: 1.因为希尔排序法的步长选取不是固定的,不同的步长会对应不同的复杂度,但是综合起来希尔排序法的时间复杂度是在O(nlogn)~O(n2)之间,近似为O(n的1.3次幂).空间复杂度为O(1 ...

  7. python希尔排序的优缺点_Python排序搜索基本算法之希尔排序实例分析

    本文实例讲述了Python排序搜索基本算法之希尔排序.分享给大家供大家参考,具体如下: 希尔排序是插入排序的扩展,通过允许非相邻的元素进行交换来提高执行效率.希尔排序最关键的是选择步长,本程序选用Kn ...

  8. 主要的七种排序(快排、希尔排序、堆排序、归并排序、选择排序、插入排序、冒泡排序)

    一.冒泡排序 冒泡排序是最简单的排序,不需要额外空间,时间复杂度为O(N^2):代码如下 import java.util.Arrays;public class BubbleSort {public ...

  9. 整理了4大类22种图表,不用担心用错统计图表,分析不出东西了

    做数据可视化,经常不知道图表要怎么用?做出来的图表又丑又看不出趋势,今天帆软君给大家分享一下如何更好地利用图表. 根据数据之间的关系,统计图表可被分为分成四个大类,你可根据自己的目的(即你想表达什么) ...

  10. 希尔排序的详细过程_算法系列: 10大常见排序算法(4)希尔排序

    本课程是从少年编程网转载的课程,目标是向中学生详细介绍计算机比赛涉及的编程语言,数据结构和算法.编程学习最好使用计算机,请登陆 www.3dian14.org (免费注册,免费学习). 一句 希尔排序 ...

最新文章

  1. Linux中iptraf命令详解(IP局域网监控工具)
  2. SectionIndexer中的getSectionForPosition()与getPositionForSection()
  3. Linux上登陆oracle并导入dmp文件
  4. JPA规范的主要内容
  5. 151. Reverse Words in a String
  6. Linux操作系统CentOS7安装
  7. 苹果:iOS 比 Android 更安全!
  8. 分布式交换机配置备份和还原
  9. STL 容器和迭代器连载8_访问顺序容器的元素
  10. MATLAB图像处理(包括图像类型转换)
  11. Python CV2图像鼠标选择任意区域截图
  12. Ubuntu下安装多个Java及切换
  13. Mac 利用 Chrome 下载所有网页上的视频
  14. 加快onenote同步速度
  15. 计算机屏幕的显示分辨率与什么有关,事实:显示器屏幕尺寸和分辨率之间是什么关系?...
  16. ubuntu如何用快捷键截图
  17. 回调函数 简单理解
  18. plc控制电机实验报告_电气控制与PLC实验实验报告
  19. msxml6.10.1129.0
  20. 【毕业季】大一学子请战

热门文章

  1. Bailian2706 麦森数【大数】
  2. 用GitHub做一份精美的在线简历
  3. html5 input valid,javascript – 如果inputElement.validity.valid == false,如何显示HTML5验证?...
  4. java jks 转pfx_证书pfx转换成jks
  5. Qt水波进度条Demo
  6. hdu 1419 最大独立集
  7. 2021临泉一中高考成绩查询,临泉三所省级示范高中高考成绩揭晓!
  8. 阿里云发布企业云原生IT成本治理方案:五大能力加速企业 FinOps 进程
  9. Linux系统中的磁盘格式
  10. 基于JavaSwing的餐厅点餐系统