七大排序

不废话,直接上代码,注释分明,思路清晰。

sortingmethod.h

#ifndef SORTINGMETHOD_H
#define SORTINGMETHOD_H#include <iostream>#define SORTTYPE intusing namespace std;/*** insert sort*/
/*direct insert sort*/
void direct_insert_sort( SORTTYPE *arr,int len);/*shell sort*/
void shell_sort(SORTTYPE *arr,int len);/*** select sort*/
/*simple select sort*/
void simple_select_sort( SORTTYPE *arr ,int len);/*heap sort*/
void heap_sort(SORTTYPE *arr,int len);
void adjust_max_heap(SORTTYPE *arr, int len,int i);
void build_max_heap(SORTTYPE *arr , int len);/*** exchange sort*/
/*bubble sort*/
void bubble_sort( SORTTYPE *arr ,int len);/*fast sort*/
void quick_sort(SORTTYPE *arr , int start, int end);/*** merge sort*/
void merge_merge_sort(SORTTYPE *arr , int first, int mid ,int last , SORTTYPE *temp);
void devide_merge_sort(SORTTYPE *arr , int first, int last , SORTTYPE *temp);
void merge_sort(SORTTYPE *arr, int len);/*show element*/
void show_element(SORTTYPE *arr , int len);#endif // SORTINGMETHOD_H

sortingmethod.cpp


#include "sortingmethod.h"/** All sorting is from min to max*//*** insert sort*/
/*direct insert sort*/
void direct_insert_sort( SORTTYPE *arr,int len){int temp ,i=0,j=0;              /*temp暂存arr[i]*/for(i = 1 ; i < len ; i++){/*对每一个arr[i]~arr[0]的数*/temp = arr[i];for(j=i ; j>0 ; j -- ) {/*当arr[j-1]比tem大时,向右移动一个位置*/if ( arr[j-1] > temp ){arr[j] = arr[j-1];}elsebreak;}/*此时j刚好为重复的那个数字*/arr[j] = temp;}//    for(i = 1; i<len ; i++){//        temp = arr[i];
//        for(j = i-1 ; j > -1 ; j--){//            if(arr[j]>temp){//                arr[j+1] = arr [j];
//            }
//            else
//                break;
//        }
//        arr[j+1] = temp;
//    }}/*shell sort*/
void shell_sort(SORTTYPE *arr,int len){/** 将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;* 每次将gap折半减小,循环上述操作;* 当gap=1时,利用直接插入,完成排序。*/int i=0,j=0,k=-1,temp=-1;int gap = len / 2;      /*初始化gap,一般时len的一半*/while( gap >= 1  ){for( i = gap ; i < len ; i+=gap ){k = i; temp = arr[k];for( j = i - gap ; (j >= 0)&&(arr[j] >temp); j -=gap ){arr[j+gap] = arr[j];k = j;}arr[k] = temp;}gap /=2;}}/*** select sort*/
/*simple select sort*/
void simple_select_sort( SORTTYPE *arr ,int len){/*简单选择排序的基本思想:比较+交换。从待排序序列中,找到关键字最小的元素;如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;从余下的 len - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。因此简单选择排序也是通过两层循环实现。第一层循环:依次遍历序列中的每一个元素第二层循环:将遍历得到的当前元素依次与余下的元素进行比较,符合最小元素的条件,则交换。*/int i=0,j=0,k=0,min,tem;for(i=0; i < len ; i++ ){min = arr[i];/*下面这个循环找到本轮的最小值和下标*/for(j = i+1 ; j < len ; j++){if(arr[j] < min){min = arr[j];k = j;}}/*如果arr[i]>min则需要交换*/if(arr[i] > min){tem= arr[i];arr[i] = arr[k];arr[k] = tem;}}}/*heap sort*//*堆排序按照以下步骤完成:1.首先将序列构建称为大顶堆;(这样满足了大顶堆那条性质:位于根节点的元素一定是当前序列的最大值2.取出当前大顶堆的根节点,将其与序列末尾元素进行交换;(此时:序列末尾的元素为已排序的最大值;由于交换了元素,当前位于根节点的堆并不一定满足大顶堆的性质)3.对交换后的n-1个序列元素进行调整,使其满足大顶堆的性质;4.重复2.3步骤,直至堆中只有1个元素为止*//* 调整大顶堆 */
void adjust_max_heap(SORTTYPE *arr, int len,int i){/** arr:待调整序列* len: 序列长度* i:需要调整的结点*//*定义一个int值保存当前序列最大值的下标*/int largest = i; int left,right;/*执行循环操作任务:1.寻找最大值的下标;2.最大值与父节点交换*/while (1) {/*获得序列左右叶子节点的下标*/left = i*2+1; right = i*2+2;/*当左叶子节点的下标小于序列长度 并且 左叶子节点的值大于父节点时,将左叶子节点的下标赋值给largest*/if(left < len  && arr[left] > arr[largest]){largest = left;}else{largest = i;}/*当右叶子节点的下标小于序列长度 并且 右叶子节点的值大于父节点时,将右叶子节点的下标值赋值给largest*/if(right < len && arr[right] > arr[largest])largest = right;/*如果largest不等于i 说明当前的父节点不是最大值,需要交换值*/int temp;if(largest != i){temp = arr[i];arr[i] = arr[largest];arr[largest] = temp;i = largest;continue;}else{break;}}
}
/*建立大顶堆*/
void build_max_heap(SORTTYPE *arr , int len){for( int i = (len-1)/2; i>-1; i-- ){adjust_max_heap(arr,len,i);}
}/* 堆排序  heap_sort */
void heap_sort(SORTTYPE *arr,int len){/*先建立大顶堆,保证最大值位于根节点;并且父节点的值大于叶子结点*/build_max_heap(arr , len);/* i = 当前堆中序列的长度.初始化为序列的长度*/int i = len;/*执行循环:1. 每次取出堆顶元素置于序列的最后(len-1,len-2,len-3...)2. 调整堆,使其继续满足大顶堆的性质,注意实时修改堆中序列的长度*/int temp;while( i > 0){temp = arr[i-1];arr[i - 1] = arr[0];arr[0] = temp;/*堆中序列长度减1*/i-=1;/*调整大顶堆*/adjust_max_heap(arr , i , 0);}
}/*** exchange sort*/
/*bubble sort*/
void bubble_sort( SORTTYPE *arr ,int len){int temp;for(int i =0 ; i < len ; i++ ){for(int j = len-1; j>i ; j --){if (arr[j] < arr[j-1]){temp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = temp;}}}}/*quick sort*/
void quick_sort(SORTTYPE *arr ,int start,int end){/*快速排序的基本思想:挖坑填数+分治法从序列当中选择一个基准数(pivot ,这里选择序列当中第一个数最为基准数)将序列当中的所有数依次遍历,比基准数大的位于其右侧,比基准数小的位于其左侧重复步骤1.2,直到所有子集当中只有一个元素为止。用伪代码描述如下:1.i =left; j = right; 将基准数挖出形成第一个坑a[i]。2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中*/int i, j ,pivot;if (start <end){i = start;j = end;pivot = arr[start];}elsereturn;             /*注意这个地方容易忘*/while(i < j){/*从右开始向左寻找第一个小于pivot的值*/while(i < j && arr[j] >= pivot)j-=1;/*将小于pivot的值移到左边*/if(i < j){arr[i] = arr[j];i+=1;}/*从左开始向右寻找第一个大于pivot的值*/while (i < j && arr[i] <= pivot)i+=1;/*将大于pivot的值移到右边*/if(i<j){arr[j] = arr[i];j-=1;}}/*循环结束后,说明 i=j,此时左边的值全都小于pivot,右边的值全都大于pivot*/arr[i]=pivot;show_element(arr,14);/*pivot的位置移动正确,那么此时只需对左右两侧的序列调用此函数进一步排序即可*//*递归调用函数:依次对左侧序列:从0 ~ i-1//右侧序列:从i+1 ~ end*/quick_sort(arr,start,i-1);cout<<"left is all right"<<endl;quick_sort(arr,i+1,end);
}/*** merge sort*/
/**  merge_sort* 归并排序的函数*/
void merge_sort(SORTTYPE *arr,int len){/*归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个典型的应用。它的基本操作是:将已有的子序列合并,达到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。归并排序要做两件事:分解----将序列每次折半拆分合并----将划分后的序列段两两排序合并因此,归并排序实际上就是两个操作,拆分+合并如何合并?arr[first...mid]为第一段,arr[mid+1...last]为第二段,并且两端已经有序,现在要将两端合成达到arr[first...last]并且也有序。(1)依次从第一段与第二段中取出元素比较,将较小的元素赋值给temp[](2)重复执行上一步,当某一段赋值结束,则将另一段剩下的元素赋值给temp[](3)此时将temp[]中的元素复制给arr[],则得到的arr[first...last]有序如何分解?(1)采用递归的方法,首先将待排序列分成A,B两组;(2)重复对A、B序列分组;(3)直到分组后组内只有一个元素,此时认为组内所有元素有序,分组结束。*/SORTTYPE  temp[len];/*调用归并排序*/devide_merge_sort(arr, 0 , len-1 , temp);}
void merge_merge_sort(SORTTYPE *arr , int first, int mid , int last , int *temp){/*合并的函数----将序列arr[first...mid]与序列arr[mid+1...last]进行合并*/int i = first, j = mid +1 ,k = 0;/*当左右两边都有数时进行比较,取较小的数*/while(i <= mid && j <= last){if( arr[i] <= arr[j])temp[k++] = arr[i++];elsetemp[k++] = arr[j++];}/*如果左边序列还有数*/while(i <= mid)temp[k++] = arr[i++];/*如果右边序列还有数*/while(j <= last)temp[k++] = arr[j++];/*将temp当中该段有序元素赋值给L待排序列使之部分有序*/for(int x = 0; x < k ; x++)arr[first + x] = temp[x];}
/*这是分组的函数*/
void devide_merge_sort(SORTTYPE *arr , int first, int last , SORTTYPE *temp){int mid;if(first < last){mid = (first + last)/2;/*使左边序列有序*/devide_merge_sort(arr, first ,mid ,temp);/*使右边序列有序*/devide_merge_sort(arr, mid+1 , last ,temp);/*将两个有序序列合并*/merge_merge_sort(arr, first ,mid , last,temp);show_element(arr , 14);}
}/*show element*/
void show_element(SORTTYPE *arr , int len){for(int i = 0; i < len ; i++ ){SORTTYPE tem = arr[i];cout<<tem<<"   ";}cout<<'\n';
}

main.cpp

#include <iostream>#include "sortingmethod.h"using namespace std;int main()
{SORTTYPE arr[] = {8,1,13,7,3,12,4,6,2,14,5,9,11,10};int len = 14;show_element(arr, len);//    direct_insert_sort(arr,len);//    bubble_sort(arr , len);//    shell_sort(arr,len);//    simple_select_sort(arr,len);//    heap_sort(arr , len);//    quick_sort(arr,0,13);//    merge_sort(arr,len);cout<<"sort ending!"<<endl;show_element(arr, len);return 0;
}

七大排序(简洁明了,注释分明,思路清晰)相关推荐

  1. 白话经典算法之七大排序

    本篇转至白话经典算法之七大排序 MoreWindows 白话经典算法之七大排序 这是本人在研一上课时所整理的文档,包括冒泡排序,直接排序这七种常用的排序方法,这些文章不仅使我在考试中取了不 错的成绩, ...

  2. 万字手撕七大排序(代码+动图演示)

    万字拿捏七大排序 1.排序的概念及其运用 1.1排序的概念 1.2 排序的运用 1.3 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想 2.1.2直接插入排序 2.1 ...

  3. 七大排序算法大汇总(上)

    目录 一.[前言]排序的稳定性: 二.七大排序总览 三.插入排序 1.1直接插入排序 1.2直接插入排序优化版--折半插入排序: 2.希尔排序 四.选择排序 1.1选择排序 1.2进阶版选择排序 2. ...

  4. 三菱R系列PLC程序 全部采用ST语言编写,内部使用函数块和结构体,程序思路清晰

    三菱R系列PLC程序 全部采用ST语言编写,内部使用函数块和结构体,程序思路清晰,简洁明了. 通过结构体和函数块的使用,可以使您在程序编写水平得到很大提高. ST语言是PLC后续的主流语言,是日后编程 ...

  5. 最详细的排序解析,理解七大排序

    最详细的排序解析,理解七大排序 mp.weixin.qq.com 点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 注: lgN在这里为1og2N简 ...

  6. 七大排序的个人总结(二) 归并排序(Merge

    七大排序的个人总结(二) 归并排序(Merge  归并排序(Merge Sort): 归并排序是一个相当"稳定"的算法对于其它排序算法,比如希尔排序,快速排序和堆排序而言,这些算法 ...

  7. 现在没有可用的软件包 *** ,但是它被其它的软件包引用了 和 E: 无法定位软件包 ***问题解决(思路清晰干货)

    现在没有可用的软件包 *** ,但是它被其它的软件包引用了 和 E: 无法定位软件包 ***问题解决(思路清晰干货) 参考文章: (1)现在没有可用的软件包 *** ,但是它被其它的软件包引用了 和 ...

  8. 手撕七大排序 (二)

    手撕七大排序 (二) 交换排序 一. 冒泡排序 1. 单趟冒泡排序 2. 多趟排序 二. 快速排序 选择排序 一. 选择排序 1. 单趟选择排序 2. 完整选择排序 二. 堆排序 交换排序 一. 冒泡 ...

  9. 三菱4轴控制伺服案例,三菱PLC FX3U加三菱1PG定位模 块控制4个松下伺服,有完整的注释,结构清晰明了。伺服控制程序JOG HOME 定位 全部写成了功能块FB .你可以直接拿过去用

    三菱4轴控制伺服案例,三菱PLC FX3U加三菱1PG定位模 块控制4个松下伺服,有完整的注释,结构清晰明了.伺服控制程序JOG HOME 定位 全部写成了功能块FB .你可以直接拿过去用,MCGS触 ...

最新文章

  1. 双系统如何删除Linux
  2. 独家 | 10分钟带你上手TensorFlow实践(附代码)
  3. 地市级地铁数据管理信息系统解决方式
  4. Zookeeper选举算法( FastLeader选主)
  5. P1232 [NOI2013] 树的计数
  6. Java集合(2)--Collection接口方法
  7. [转]新东方老师上课讲的笑话(太有才了)
  8. java盒图_java合成图片
  9. 如何去学会黑客技术,黑客电脑技术学习必备知识
  10. 嘉年华回顾丨PingCAP CEO 刘奇,带你探寻TiDB...
  11. Codeforces518 D. Ilya and Escalator
  12. 数模竞赛必备参考书籍《算法竞赛入门经典(第2版)》PDF免费下载
  13. 深入浅出设计模式(一):单例模式
  14. Java笔记(1)黑马刘意_Java入门_2019_idea版
  15. ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新
  16. python主函数怎么写_python怎么写函数
  17. 万字综述自动驾驶数据闭环
  18. C++图书ISBN码校验
  19. js实现外链访问劫持代码 可劫持百度快照
  20. JSR规范系列(1)——Java版本、JSR规范和JCP社区流程概述

热门文章

  1. C++ 高性能计算之多线程简单基础入门教程
  2. 巧妙防治网上病毒侵害的方法步骤
  3. PHP使用FFMPEG进行音频视频操作(音频声道转换)Win AND Linux
  4. ipad刷机的时候,突然中断了怎么处理好
  5. Android动态部署六:如何从插件apk中启动BroadcastReceiver和ContentProvider
  6. 2020年有寓意的领证日期_2020年,这些日期去领证含有特殊的寓意
  7. 光学仿真2020-12-09
  8. 转载:Mac 电脑如何安装mac os 和win7双系统(win7多分区)
  9. 移动工作站和便携游戏本的区别
  10. 律师的最高境界:呆若木鸡