介绍
小编给大家分享一下c语言常用的排序算法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
1。插入排序
基本思想:插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
void insertSort (vector,, num) { int 才能;k =, 0; for 才能;(int 小姐:=,0;,小姐:& lt;, nums.size ();, + + i) {才能 ,,,int temp =, num[我]; ,,,int j =,我; ,,,for (;, j 祝辞,0,,,,temp & lt;, num [j - 1];, - j) ,,,,,num [j],=, num (j - 1); ,,,num [j],=,温度; ,,} }
2。希尔排序
基本思想:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
void shellSort (vector,, num) { for 才能;(int gap =, nums.size (),/, 2,, gap 祝辞,0;,gap /=, 2) {才能 ,,,for (int 小姐:=,差距;,小姐:& lt;, nums.size ();, + + i) ,,,{ ,,,,,int temp =, num[我]; ,,,,,int j =,我; ,,,,,for (;, j 祝辞=gap ,,, temp & lt;, num [j-gap];, j -=, gap) ,,,,,,,num [j],=, num (j 安康;差距); ,,,,,num [j],=,温度; ,,,} ,,} }
3。堆排序
用一句概括,堆排序就是一种改进的选择排序,改进的地方在于,每次做选择的时候,不单单把最大的数字选择出来,而且把排序过程中的一些操作进行了记录,这样在后续排序中可以利用,并且有分组的思想在里面,从而提高了排序效率,其效率为O (n * logn)。
# include, int c=0;/* heapadjust()函数的功能是实现从一个[m]到[n]的数据进行调整,使其满足大顶堆的特性*//*[]是待处理的数组,m是起始坐标,,n是终止坐标*/void heapadjust (int [], int m, int n), { int 我,临时; temp=[m]; for (i=2 * m; i<=n;我*=2)//从m的左孩子开始, { 如果(i + 1 & lt;=n ,,,(我)& lt; (i + 1))//如果左孩子小于右孩子,则将我+ +,这样我的值就是最大孩子的下标值, { 我+ +; } 如果([我]& lt;临时)//如果最大的孩子小于临时,则不做任何操作,退出循环,否则交换一个[m]和[我]的值,将最大值放到一个[我]处, { 打破; } [m]=[我]; m=我; } 一个[m]=temp; } void crtheap (int [], int n)//初始化创建一个大顶堆, { int 我; for (i=n/2;, i> 0;,我——)//n/2为最后一个双亲节点,依次向前建立大顶堆, { heapadjust(,,我,,n); } }/*交换()函数的作用是将一个[我]和[j]互换*/void 交换(int [], int 我,int j), { int 温度; temp=[我]; [我]=[j]; 一个[j]=temp; c++; } void 堆排序(int [], int n), { int 我; crtheap (,, n); for (i=n;, i> 1;,我——), { 交换(,,1,,i);//将第一个数,也就是从一个[1]到[我]中的最大的数,放到一个[我]的位置, heapadjust(,, 1,,张);//对剩下的一个[1]到[我],再次进行堆排序,选出最大的值,放到一个[1]的位置 } } int 主要(空白), { int 我; int [10]={1, 5、2 6 0, 3、9日1日7日4}; printf(“排序前:“); for (i=1; i<10;我+ +), { printf (“% d"[我]); } 堆排序(一个,,9); printf (“\ n \ n共交换数据% d次\ n \ n",, c); printf(“排序后:“); for (i=1; i<10;我+ +), { printf (“% d"[我]); } printf (“\ n \ n \ n"); return 0; }
4。归并排序
基本思想:归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排的序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: