演算法大致流程:給定初始序列l,l從前往後依次取出乙個資料,將其直接插入到有序序列中。
演算法的複雜度分析:時間複雜度:最壞的情況下,每從無序序列中取乙個元素,就要遍歷一遍有序序列,複雜度為o(n2);最好的情況下,每從無序序列中取出乙個元素,直接放在了有序序列的後面,也就是不用遍歷有序序列,此時,複雜度為o(n)。所以,平均複雜度為o(n2)。
空間複雜度:o(1)
1 #include2#define maxsize 100
3void
out(int number,intn)4
8void insertsort(int number,intn)9
25if(flag==1)26
break;27
}28}29
out(number,n);30}
3132
intmain()
33
演算法大致流程:給定初始序列l,l從前往後依次取出乙個資料,將其插入到有序序列中,到這裡和直接插入排序相同。不同之處就在於,插入到有序序列中時,由於其是有序的,我們就可以採用二分的方式快速找到該元素在有序序列中的位置。
演算法的複雜度分析:時間複雜度:最壞的情況下,每從無序序列中取乙個元素,就要遍歷n/2個有序序列元素,複雜度為o(n2),最好的情況和直接插入排序一樣,也是o(n)。平均複雜度為:o(n2)。
空間複雜度:o(1)
演算法大致流程:給定初始序列l,假設下標為0、1、2、3……n,例如,首先以5為增量分割序列,所以,0、5、10、15……為一組;1、6、11、16……為一組;2、7、12、17……為一組,將數列分為5組,這五組序列分別進行排序,構成一趟希爾排序。然後對排序後的整個數列,以3為增量分割序列,所以,0、3、6、9……一組;1、4、7、……一組,2、5、8、……一組,分為3組,對這三組資料分別進行排序,又做了一趟希爾排序。最後直到增量為1,就相當於整個序列作為一組進行一趟排序,從而使最終序列有序。
注:對於增量的選擇,增量序列中沒有除1以外的公因子,例如5、3、1就符合,8、4、2、1有公因子2,不符合。
演算法的複雜度分析:時間複雜度:o(nlog2n)
空間複雜度:o(1)
演算法大致流程:給定初始序列l(含有n個元素),先用第0個元素和第1個元素比較,如果第0個元素比第1個元素大,則兩個元素交換,否則什麼都不做,然後第1個元素和2個元素比較,如果第1個元素大,則交換,一直進行下去,直到比較到n-2和n-1,完成一趟冒泡,最大的元素a被就冒上來,放在了正確的位置上(即最大的放在了最後)。然後採用相同的方法完成第二次冒泡,直到比較到n-3和n-2,那麼除了a意外的其他所有元素的最大值最終放在了n-2的位置上……最後,只剩2個元素時,比較,交換,演算法完成。在一趟冒泡過程中,沒有元素交換,也結束演算法。
演算法的複雜度分析:時間複雜度:最壞情況下,每次都要交換,複雜度為o(n2),最好的情況是已經有序,複雜度為o(n)。平均複雜度為:o(n2)。
空間複雜度:o(1)
1 #include 23void swap(int *a,int *b)410
11int
main()
1226}27
}28for(i=0;ii)
2932
return0;
33 }
演算法的大致流程:給定初始序列l,任意選定某個數作為基準(一般選擇序列的第乙個數l[0]),從l[1]開始向右依次比較,第一次發現某個數l[k]比基準大的時候,交換l[0]和l[left],此時的位置記為「left=left+1」,然後再開始從右往左檢視,l[n-1]、l[n-2]……,當發現第乙個比l[0]小的l[right]時候,交換l[0]和l[right],此時記錄位置為「right=right+1」,然後從l[left]開始向右看,重複上述過程,直到遇到比l[0]大的元素,記錄位置,從l[right]開始向左看……直到left和right相遇,一趟快排完成,此時l[0]左邊的元素均比l[0]小,l[0]右邊的元素均比l[0]大。l[0]將l分成左右兩部分,l和r。
對l和r分別執行和l一樣的操作,直到最後分得的l和r中只有兩個元素。
演算法的複雜度分析:時間複雜度:最好的情況下是:o(nlog2n),最壞的情況下是o(n2),待排序列越接近無序,效率越高,越有序,效率越低,排序的趟數和初始序列有關。平均複雜度為o(nlog2n)。
空間複雜度:需要借助棧,o(log2n)
1 #include2intn;
3void quick_sort(int number,int left,int
right)
412 temp=left;
13 a=left;
14 b=right;
15 start=number[left];
16while(left1723 number[temp]=number[right];
24 temp=right;
25while(number[left]<=start&&left2629 number[temp]=number[left];
30 temp=left;31}
32 number[temp]=start;
33 quick_sort(number,a,right-1
);34 quick_sort(number,left+1
,b);35}
3637
intmain()
3849
return0;
50 }
演算法大致流程:給定初始序列l(n個元素),從l中選擇最小的值,和第乙個元素交換,完成一次選擇,此時有序序列的元素個數為1,無序序列的元素個數為n-1。接著對無序序列做相同的操作……直到無序序列個數為0,演算法結束。
演算法的複雜度分析:時間複雜度:平均複雜度為o(n2)。
空間複雜度:o(1)
1 #include2void swap(int *a,int *b)39
10int
main()
1120
21for(i=0;i)
2231
}32 swap(&number[point],&number[i]);33}
3435
for(i=0;i)
3639
return0;
40 }
堆:可看做一棵完全二叉樹,對於每個非葉節點,滿足父親比孩子小(最小堆)或者父親比孩子大(最大堆)。
演算法大致流程:首先,用初始序列構建一棵完全二叉樹,從最後乙個非葉節點往前依次調整——比較他和它兩個孩子的大小關係,若比兩個孩子小,則將該父節點和兩個孩子中較大的交換,即構建最大堆。
建立好最大堆時,第一趟排序完成,此時堆頂元素為最大元素,將他和最後乙個元素交換,剩下的元素還是一棵完全二叉樹,但是可能不滿足堆的定義,將其重新構建為最大堆,(此時不滿足最大堆的元素只有交換的那個值,所以,只需要調整那個值就可以了),將堆頂元素和最後乙個元素交換,將剩下的元素構建最大堆,直到剩餘元素只有1個,演算法結束。
演算法的複雜度分析:時間複雜度:最好和最壞的情況下複雜度均為o(nlog2n)。
空間複雜度:o(1)
演算法的大致流程:首先將初始序列l中每個元素作為一組,共分為n組。n組中相鄰的兩兩歸併,形成n/2(向上取整)組,將這些組內的元素進行排序,然後將這n/2(向上取整)組元素再兩兩歸併,形成n/4(向上取整)組,將組內元素排序……重複這個操作,直到n/2k=1,即最後歸併為整個序列l,使之有序,演算法結束。
演算法的複雜度分析:時間複雜度:和初始序列無關,最好和最壞的情況下複雜度均為o(nlog2n)。
空間複雜度:需要轉存序列,空間複雜度為o(n)
演算法大致流程:基數排序就是按多個關鍵字進行排序,這裡舉兩個栗子:
1、撲克牌(除大小王)排序:按照兩個關鍵字:花色和數字。先按花色將牌分為4堆,然後將這4堆牌分別按照數字大小排序,最終使整副牌有序。
2、數字排序:按照低位優先的順序,分別進行「分配」和「收集」操作,從低位到高位所有位都比完之後,演算法完成,整個序列有序。
例如:對278、109、063、930、589、184、505、269、008、083進行基數排序。
首先,縱觀全部的數字,0~9都有,那麼我們就設定10和桶來接收這些位。
(1)先從最低位(個位)開始,即按照個位數進行分配,其餘先不管,分配結果如下:桶0
1234
5678
9元素930184
505008
收集的時候,每個桶看成佇列,執行「先進先出」,所以收集結果為「930、063、083、184、505、278、008、109、589、269」
(2)按照十位分配,結果如下:桶0
1234
5678
9元素930278
收集:「505、008、109、930、063、269、278、083、184、589」
(3)按照百位進行分配,結果如下:桶0
1234
5678
9元素930收集結果:「008、063、083、109、184、269、278、505、589、930」
至此,所有的位都比較完,演算法結束,可見,最後的序列就是從小到大有序的。
該演算法的思想就是,每次比較某一位時,「分配」的目的是保證下一位小的在前面,「收集」的目的是保證,該為小的在前面,這樣,所有的收集分配結束後,小的在前面,大的在後面。
演算法的複雜度分析:時間複雜度:平均和最壞的情況下複雜度均為o(d*(n+rd))。其中,d為關鍵字位數,栗子中d=3。n為元素數,栗子中,n=10。rd關鍵字取值範圍,栗子中rd=10(即0~9)。
空間複雜度:需要rd個桶,空間複雜度為o(rd)。
排序演算法總結
1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...
排序演算法總結
1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...
排序演算法總結
學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...