1、直接插入排序:是最簡單的排序方法,算法簡單來講就是能夠把第一個數a[0]看作有序數組,那麼a[1]要插入進來,對比,插入合適位置;而後a[0],a[1]是有序數組,插入a[2]就依次和a[0],a[1]比較並插入,若a[2]需插在最前面,那a[0],a[1]都要依次後移。。。以此類推。因此插入排序有不少比較及交換的過程。時間複雜度爲O(n2)。下面是本身編的插入排序的代碼,很簡單嗯:
算法
void InsertSort(int *a,int length)數組
{spa
int temp=0;排序
for(int i=1;i<length;i++)遞歸
{it
for(int j=0;j<i;j++)io
{ast
if(a[i]<a[j])方法
{時間
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
2、希爾排序:也是一種插入排序,可是用簡單的算法有了大的複雜度改進。簡單來講就是設置了一個增量表K[]。好比有一個10個數字的數組須要排序的話,能夠把增量表設置成K[3]={5,3,1}。先以增量5排序,就是把10個數字數組分區成爲{R1,R6};{R2,R7};{R3,R8};{R4,R9};{R5,R10}.區域內各自使用插入排序,而後再以增量3排序,最後必定要用增量1排序,確認總體的順序正確。這樣能夠由於小區域內的簡單排序,確保整個數組」基本有序「,最後再進行一次校驗,校驗的時候就不須要過多的交換而浪費時間。可是希爾排序的複雜度很難分析,和增量序列也有關係。姑且記住當增量序列dlta[k]=2t-k+1-1時,其複雜度爲O(n3/2)。
void ShellSort(int *array,int *dk,int length)
{
for(int i=0;i<sizeof(dk);i++)
{
ShellFastSort(array,dk[i],length);
}
}
void ShellFastSort(int *a,int k, int len)
{
int temp;
for(int i=0;i<k;i++)
{
for(int j=i+k;j<len;j+=k)
{
for(int m=i;m<j;m+=k)
if(a[m]>a[j])
{
temp=a[j];
a[j]=a[m];
a[m]=temp;
}
}
}
}
3、冒泡排序:經典排序算法,交換的思想。數與數依次比較,大的就日後移,第一趟排序能把最大的數交換到最後一個位置,第二趟把第二大的數字交換到倒數第二的位置。。。時間複雜度仍是O(n2).
for(int j=n;j>0;j--)
{
for(int i=1;i<j;i++)
{
if(array[i-1]>array[i]){
temp=array[i];
array[i]=array[i-1];
array[i-1]=temp;
}
}
}
4、快速排序:是對冒泡排序的改進,思想簡單來講,一趟排序把數字分紅大數字區域和小數字區域,間隔點也就是所謂的「樞軸(pivot)「可任意選。一般把第一個數字做爲樞軸,劃分紅兩個區域後,再各自劃分,不斷遞歸,最後就剩兩個或三個數字的區域,就很簡單就能排列出來了。(不過代碼仍是稍微糾結了一下才寫出來啊。。。)棧的最大深度可降爲O(logn)
void FastSort(int *a,int low,int high)
{
int pivotloc=0;
if(low<high){
pivotloc=partition(a,low,high);
FastSort(a,low,pivotloc-1);
FastSort(a,pivotloc+1,high);
}
}
int partition(int *a,int low,int high)
{
int pivotkey=a[low],temp;
while(low<high){
while(low<high&&a[high]>=pivotkey){high--;}
if(low<high)
a[low++]=a[high];
while(low<high&&a[low]<=pivotkey){low++;}
if(low<high)
a[high--]=a[low];
}
return low;
}