几种排序算法
所有排序都是从小到大进行排序
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;
- }
- }
- }
……