算法学习笔记(三)-----各种基础排序问题
2019獨角獸企業重金招聘Python工程師標準>>>
一、直接插入排序:是最簡單的排序方法,算法簡單來說就是可以把第一個數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)
{
int temp=0;
for(int i=1;i<length;i++)
{
for(int j=0;j<i;j++)
{
if(a[i]<a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
二、希爾排序:也是一種插入排序,但是用簡單的算法有了大的復雜度改進。簡單來說就是設置了一個增量表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;
}
}
}
}
三、冒泡排序:經典排序算法,交換的思想。數與數依次比較,大的就往后移,第一趟排序能把最大的數交換到最后一個位置,第二趟把第二大的數字交換到倒數第二的位置。。。時間復雜度還是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;
??????????????????????????? }
?????????????????? }
???????? }
四、快速排序:是對冒泡排序的改進,思想簡單來說,一趟排序把數字分成大數字區域和小數字區域,間隔點也就是所謂的“樞軸(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;
}
轉載于:https://my.oschina.net/u/1475850/blog/221772
總結
以上是生活随笔為你收集整理的算法学习笔记(三)-----各种基础排序问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信软件测试计划
- 下一篇: 计算机无法安装小丸工具箱,小丸工具箱