日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法学习笔记(三)-----各种基础排序问题

發布時間:2023/12/9 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法学习笔记(三)-----各种基础排序问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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時,其復雜度為On3/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;

}

}

}

}

三、冒泡排序:經典排序算法,交換的思想。數與數依次比較,大的就往后移,第一趟排序能把最大的數交換到最后一個位置,第二趟把第二大的數字交換到倒數第二的位置。。。時間復雜度還是On2.

??? 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)“可任意選。通常把第一個數字作為樞軸,劃分成兩個區域后,再各自劃分,不斷遞歸,最后就剩兩個或三個數字的區域,就很簡單就能排列出來了。(不過代碼還是稍微糾結了一下才寫出來啊。。。)棧的最大深度可降為Ologn

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

總結

以上是生活随笔為你收集整理的算法学习笔记(三)-----各种基础排序问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。