排序算法

来源:互联网 发布:windows关闭端口 编辑:程序博客网 时间:2024/05/16 04:44
/***********************
1  插入排序:选择元素从一端开始比较,被比较元素后移或前移
2  选择排序:找出符合当前排序顺序位置的元素的下标,再交换元素
3  冒泡排序:
4  归并排序:将两个已经排好顺序的序列归并为一个有序序列,外层、中层、内层共同参数:StrDst、StrSrc
                      外层:确定两个已经排好顺序序列 len,并保证最终有序序在StrDst中
                      中层:根据外层提供的len来将0-n划分为若干分序列,并在每次划分后调用内层将相邻序列排序
                      内层:根据中层提供的相距len的序列下标,进行归并排序
       
**********************/
一    简单排序算法

   1  插入排序

      先选择元素,再找到插入位置

      找排序位置同时,空出排序位置

      O(n2)

#define MAX 10int arry[MAX+1];int n;void resort(){  int i,j,NewInput;  for(i=1;i<n;i++)  {     arry[i]=scanf("%d",&NewInput);  }  for(i=1;i<n;i++)  {     arry[0]=arry[i];     j=i-1;     while(arry[0]<arry[j])     {          arry[j+1]=arry[j];        j--;     }     arry[j+1]=arry[0];  }}


2   选择排序

        先选择位置,再选择插入元素

        每次只需移动一次位置

#define MAX 10int arry[MAX+1]void resort(){  int i,j,k,m;  for(i=0;i<MAX;i++)  {     arry[i]=scanf("%d",&m);  }  for(i=0;i<MAX;i++)  {     k=i;     for(j=i+1;J++;j<MAX)     {        if(arry[i]>arry[j])           k=j;        }      if(k!=i)      {        arry[MAX+1]=arry[i];        arry[i]=arry[k];        arry[k]=arry[MAX+1];      }  }}
 

      3 冒泡排序

      O(n2)


二  复杂排序算法

/*归并排序*/#define MAX int n;int ArrySor[MAX],ArryDst[MAX];/*内层算法*/void resort1(int ArrySor[],ArryDst[],int low,int mid,int high){int i=low,j=mid,k=low;while((i<mid)&&(j<high)){if(ArrySor[i]<ArryDst[j]) ArryDst[k++]=ArrySor[i++];else ArryDst[k++]=ArrySor[j++];}if(i<mid)ArryOut[k++]=ArryIn[i++];if(j<high)ArryOut[k++]=ArryIn[j++];}/*中层算法*/void resort2(int ArrySOr[],int ArryDst[],int length){int i=0,j;while((i+2*length-1)<n){resort1(ArrySor[],ArryDst[],i,i+length,i+2*length);i+=2*length;}if((i+length)<n)resort1(ArrySor[],ArryDst[],i,i+length,n);elsefor(j=i;j<n;j++)ArryDst[j]=ArrySor[j];}/*外层算法*/void resot3(){int length=1;while(length<n){resort2(ArrySor,ArryDst,length);        length*=2;resort2(ArryDst,ArryDst,length);         length*=2;}}


  1  归并排序





 


       内层算法






       中层算法


     


    


    外层算法





    2  快速排序算法


void resort(int low,int high){if(low>=high)return;int i,j;i=low,j=high;arry[MAX+1]=arry[i];while(i<j){while((arry[j]>arry[MAX+1])&&(i<j))j--;if(arry[j]<arry[MAX+1])arry[i++]=arry[j];while((arry[i]<arry[MAX+1])&&(i<j))i++;if(arry[i]>arry[MAX+1])arry[j--]=arry[MAX+1];}arry[i]=arry[MAX+1];if(low<i-1)resort(low,i-1);if(i+1<high)resort(i+1,high);}






0 0