几种排序算法
Posted tisou1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几种排序算法相关的知识,希望对你有一定的参考价值。
所有排序都是从小到大进行排序
1插入排序
插入排序的思想主要是,将[a1,a2,a3,a4....ai.......an]前ai-1个序列看成有序的,然后用第ai个数与前面的数进行比较,找到位置进行插入
int i,j,temp;//a[len] for(i=1;i<len;i++){//假设a[0]一个数为有序数列,从a[1]开始,依次进行比较 if(a[i]<a[i-1]){//满足条件 temp = a[i];//暂时存放a[i] a[i] = a[i-1]; for(j=i-2;temp<a[j];j--)//继续与前面的数进行比较 a[j+1] = a[j]; a[j+1] = temp; //将a[i]这个数放到对应的位置上 } }
2.折半插入排序
在插入排序的基础上,将序列分为两部分(低半区,高半区)
int i,j,temp; for(i=1;i<len;i++){ temp = a[i]; int low=0,high=i-1; while(low<=high){ int m = (low+high)/2; if(temp<a[m]) high = m - 1;//插入点在低半区 else low = m + 1;//插入点在高半区 } for(j=i-1;j>=high+1;j--)//从插入点到i这个位置,进行位置交换 //1 2 4 5 i=3排列后high=2;4 5要一次后移为3腾出位置 a[j+1] = a[j]; a[high+1] = temp; //当low>high是,插入点就在high+1位置 }
3.希尔排序
希尔排序又称缩小增量排序,它也属于插入排序
基本思想是:将整个代排记录分割成若干个子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行一次直接插入排序
最后一个增量一定是1
//希尔排序 void shellInsert(int dk){ int i,j; for(i=dk;i<len;i++){ if(a[i]<a[i-dk]){ int temp = a[i]; for(j=i-dk;j>=0&&temp<a[j];j-=dk){//当前小组内进行移动 a[j+dk] = a[j]; } a[j+dk] = temp; } } } void sort3(){ int dlta[] = {5,3,1};//增量序列 for(int k=0;k<3;k++) shellInsert(dlta[k]); }
4.快速排序
快速排序是冒泡排序的升级,将任务一分为二,
基本思想是:通过一趟排序,将待排记录分割成独立的两部分,(低半区,高半区),然后再分别对分隔出的两部分进行排序
通过基本思想,我们可以用递归来写
//快速排序 int Partition(int a[],int low,int high){ int pivokey; //a[n] = a[low];//用a[n+1]存放枢轴 pivokey = a[low]; while(low<high){ while(low<high&&pivokey<=a[high]) high--; a[low] = a[high];//将比中间值小的数移到低端 while(low<high&&pivokey>=a[low]) low++; a[high] = a[low];//将比中间值大的数移到高端 } a[low] = pivokey; return low;//返回枢纽位置 } void sort4(int low,int high){ //int low=0,high=len-1; if(low<high){ int pivotloc = Partition(a,low,high); sort4(low,pivotloc-1); sort4(pivotloc+1,high); } }
5.简单选择排序
//选择排序 void sort5(){ int i,j; for(i=0;i<len;i++){ int min = i; for(j=i+1;j<len;j++){ if(a[min]>a[j]) min=j; } if(min!=i){ int temp = a[min]; a[min] = a[i]; a[i] = temp; } } }
......
以上是关于几种排序算法的主要内容,如果未能解决你的问题,请参考以下文章