目录

  • 前言
  • 算法复杂度比较
  • 交换排序
    • 冒泡排序
    • 快速排序
  • 插入排序
    • 简单插入排序
    • 希尔排序
  • 选择排序
    • 简单选择排序
    • 堆排序
  • 归并排序

前言

自己总结的C++八大排序算法,编码规范全部按照公司要求。欢迎补充,后续逐步完善。

算法复杂度比较

交换排序

冒泡排序

代码思路:它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。每趟将最大值放置在末尾。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

/*
相邻元素比较:选择小的元素放在前面
*/
void bubble_sort(vector<int> &nums, int n)
{bool flag;for(int i = 0; i < n - 1; i++){flag = false;for(int j = 0; j < n - i - 1; j++){if(nums[j] > nums[j+1]){swap(nums[j], nums[j+1]);flag = true;}}if(!flag){break;}}
}

快速排序

代码思路:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

/*
选择一个基准,将基准移动到数据中间,使得左边的数据都小于基准,右边的数都大于基准
递归划分,当数据元素等于1个的就是一个的时候就是有序的了
*/
void quick_sort(vector<int> &nums, int l, int r){if(l + 1 >=r){return;}int low = l;int high = r -1;int key = nums[low];while (low < high){while (low < high && nums[high] >= key){high--;}nums[low] = nums[high];while (low < high && nums[low] <= key){low++;}nums[high] = nums[low];}nums[low] = key;quick_sort(nums, l, low);quick_sort(nums, low+1, r);
}

插入排序

简单插入排序

代码思路:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

/*
插入排序法:
拿着当前位置元素和前面的元素进行比较,只要当前元素比前面的元素大,则插入到该元素前面
直到前面的元素不满足要求,记录插入位置。
先拿出来 再比较插入
*/
void insert_sort(vector<int> &nums, int n)
{for(int i = 0; i < n; i++){for(int j = i; j>0 && nums[j]<nums[j-1]; j--){swap(nums[j], nums[j-1]);}}
}

希尔排序

代码思路: 先将整个记录, 通过间隔分成若干个子序列, 分别进行插入排序, 待整个序列基本有序时, 再进行一次插入排序.
因为插入排序时, 有可能重复移动数据, 希尔排序, 是一次移动较多的距离(间隔),减少重复移动, 所以降低了时间复杂度.
时间复杂度约为: O(n^(3/2)).

//核心思想还是使用插入排序算法
//通过分组,让数据在小规模内有序,减小递归增量使得整体有序
void shell_sort(vector<int> &nums)
{int i = 0;int j = 0;int temp = 0;int size = nums.size();int gap = size/2;//设置增量while(gap >= 1){for(i = gap; i<size; i++) //对所有组采用直接插入排序{temp = nums[i];//temp保存gap的数字j = i - gap;while ((j >= 0) && (temp < nums[j])){nums[j + gap] = nums[j];j -= gap;}nums[j + gap] = temp;}gap /=2;}
}

选择排序

简单选择排序

代码思路:选择前面n-1个数中的最大值,和当前队尾数据交换,因为要交换最大值,所以要记录最大值位置的索引。
首先在未排序序列中找到最大元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最大元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

/*
从该位置后面选择最小的元素放在该位置
*/
void select_sort(vector<int > &nums, int n)
{for(int i = 0; i<n-1; i++){int min = i;for(int j = i+1; j<n; j++){if(nums[j]<nums[mid]){min = j;}}swap(nums[min], mums[i]);}
}

堆排序

代码思路:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

/*
先建立一个堆,在依据堆顶为最大值的性质,循环抽出堆顶最大值交换到堆的末尾位置,有序序列,由于抽出最大值破坏了堆的性质,因此要重新heapify
而在建立堆的过程中,首先面临的是一堆无序的数,需要从最后一个节点的父节点开始heapify,才能使得整个数组变成堆,其中heapify的过程就是递归将调整父节点子节点的过程
*/void creat_heap(vector<int> &nums, int i, int num) //创建大堆顶,i为当节点,n为堆的大小,如果儿子节点比父亲节点大,则进行交换。
{for(; i >= 0; --i){int left = 2*i+1; //左子树节点int right = 2*i+2; //右子树节点int max = 0;if(left < num && nums[left]>nums[max]){max = left;}if(right < num && nums[right]>nums[max]){max = right;}//交换子节点与父节点if(nums[max] > nums[i]){swap(nums[max], nums[i]);}}
}void heap_sort(vector<int> &nums)
{int size = nums.size();creat_heap(nums, size/2 - 1, size);for(int j = size - 1; j>=0; j--)//交换第一个元素和最后一个元素后,堆的大小减1{swap(nums[0], nums[j]);int i = j/2-1;creat_heap(nums, i, j);}
}

归并排序

代码思路:归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

/*
把长度为n的输入序列分成两个长度为n/2的子序列;
对这两个子序列分别采用归并排序;
将两个排序好的子序列合并成一个最终的排序序列。
*/
void merge(vector<int> &nums, int l, int mid, int r)
{int *temp = new int(r - l + 1);int p1 = l;int p2 = mid + 1;int i = 0;while (p1 <= mid && p2 <=r){temp[i++] = nums[p1]>nums[p2] ? nums[p2++] : nums[p1++]; }while (p1<=mid){temp[i++]=nums[p1++];}while (p2<=r){temp[i++]=nums[p2++];}for(int i=0; i<r; i++){nums[i++] = temp[i++];}
}void merge_sort(vector<int> &nums, int l, int r)
{if(l < r){int mid = (r+l)/2;merge_sort(nums, l, mid);merge_sort(nums, mid+1, r);merge(nums, l, mid, r);}
}

C++实现常用八大排序算法相关推荐

  1. 数据结构 常用八大排序算法及代码实现

    一.排序的介绍 1. 排序的分类 按照排序过程中所依据的原则的不同可以分类为: ►插入排序:直接插入排序  希尔排序 ►交换排序:冒泡排序  快速排序 ►选择排序:简单选择排序  堆排序 ►归并排序 ...

  2. 图解八大排序算法——我见过的最详细的讲解(转)

    一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...

  3. 用python排序算法_Python - 八大排序算法

    1.序言 本文使用Python实现了一些常用的排序方法.文章结构如下: 1.直接插入排序 2.希尔排序 3.冒泡排序 4.快速排序 5.简单选择排序 6.堆排序 7.归并排序 8.基数排序 上述所有的 ...

  4. Python实现八大排序算法(转载)+ 桶排序(原创)

    插入排序 核心思想 代码实现 希尔排序 核心思想 代码实现 冒泡排序 核心思想 代码实现 快速排序 核心思想 代码实现 直接选择排序 核心思想 代码实现 堆排序 核心思想 代码实现 归并排序 核心思想 ...

  5. python 排序算法 简书_Python---简析八大排序算法

    前言 1 .排序的概念 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列. 排序分为内部排序和外部排序. 若整个排序过 ...

  6. 八大排序算法的 Python 实现

    八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入 ...

  7. 精通八大排序算法系列:二、堆排序算法

    精通八大排序算法系列:二.堆排序算法 作者:July .二零一一年二月二十日 本文参考:Introduction To Algorithms,second edition. ------------- ...

  8. 常用的排序算法的时间复杂度和空间复杂度

    常用的排序算法的时间复杂度和空间复杂度                                           1.时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出 ...

  9. 八大排序算法的java实现

    八大排序算法的java实现 有时间再贴算法分析图 JDK7的Collections.sort()的算法是TimSort, 适应性的归并排序, 比较晦涩难懂, 这里没有实现 public class m ...

  10. 八大排序算法(理论和动态图)

    八大排序算法 一.冒泡排序 二.选择排序 三.快速排序 四.归并排序 五.堆排序 六.直接插入排序 七.希尔排序 八.基数排序 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或 递减的排 ...

最新文章

  1. Redux入门之实现一个迷你版的Redux
  2. 2016 GDCPC 省赛总结
  3. 深入理解:一文讲透RabbitMQ
  4. Spark 中 File,Block,Split,Task,Partition,RDD概念的理解
  5. 使用NRF2401 STM32F303ZET6 NUCLEO 开发板
  6. 前景检测算法(一)--综述
  7. org.apache.common.io-FileUtils详解
  8. 【Python小程序】第1讲:如何提取指定时间段的数据子集?
  9. 测试Live Write的发布功能
  10. 第八章 (二)贪心法
  11. JAVA中Random分析
  12. python的基础语法
  13. 语言学句法分析树形图怎么画_树形图(句法)
  14. 新浪云python开发_Python开发入门与实战17-新浪云部署
  15. 图解阿里达摩院内部结构
  16. python绝技运用python成为顶级pdf_python绝技运用Python成为顶级黑客PDF高清文档免费下载...
  17. 《Learning without Forgetting》 论文阅读笔记
  18. Android9自带的游戏怎么玩,[Android]手机也能玩电脑游戏,PC游戏模拟器ED302-9最新版及详细使用帮助 | 樱花庄...
  19. Java环境变量的配置与介绍
  20. 【js】仿照网易云音乐制作的音乐播放组件

热门文章

  1. vue移动端实现电子签名画板
  2. json 转 map,循环得到 key,value
  3. 3dmax 保存慢 卡死
  4. CentOS7.4 更改SSH端口号
  5. QAM调制原理_锁相环(PLL)基本原理 PLL电路常见构建模块
  6. 地球上最厉害的字体:Helvetica
  7. 在线答题助手c语言源码,很早之前发的逆水寒答题助手,开源!!自己可以修改成任何答题器源码!~~...
  8. asp.net接受表单验证格式后再提交数据_药物临床试验数据管理与统计分析的计划和报告指导原则...
  9. Recyclerview-BRVAH使用
  10. 互联网晚报 | 12月2日 星期四 | 荣耀60系列正式发布;高通发布全新一代骁龙8移动平台;新东方在线布局教育智能硬件...