排序演算法(一)

2021-06-19 22:26:07 字數 1238 閱讀 2304

這個學期課程很少,空閒時間很多,故重新複習了一下《演算法導論》中的常用演算法和資料結構,並且將實現**儲存到部落格,以便大三暑假找實習時方便複習。。。。

直接插入排序的思想非常簡單,將序列中第乙個元素作為乙個有序序列,然後將剩下的n-1個元素按關鍵字大小依此插入該有序序列,每插入乙個元素後依然保持該序列有序,經過n-1趟排序後即成為有序序列。該演算法的時間複雜度是o(n^2)。

templatevoid insertionsort(t *a, int length)

a[j+1] = temp;

}}

氣泡排序也是乙個較簡單的排序演算法。氣泡排序通過不斷交換兩個元素實現,它的思想是:第一趟在序列(a[0]~a[n-1])中從前往後進行兩個相鄰元素的比較,若後者小,則交換,比較n-1次;第一趟排序結束,最大元素被交換到a[n-1]中(大的泡泡不斷沉底),下一趟排序則只需在子串行(a[0]~a[n-2])中進行;如果在某一趟排序中未交換元素,說明子串行已經有序,則不再進行下一趟排序。氣泡排序演算法的時間複雜度同樣是o(n^2)。

templatevoid bubblesort(t *a, int length)

}i = last;

}}

如上**是通過last的設定來判斷是否需要繼續排序的。

歸併排序是分治思想的應用,即不斷將原問題劃分為較小並較易解決的子問題,然後再合併子問題的結果得到原問題的結果。直觀的操作如下:

a.分解:將n個元素分成各含n/2個元素的子串行;

b.解決:用合併排序法對兩個子串行遞迴地排序;

c.合併:合併兩個已排序的子串行以得到排序結果。

故歸併排序的關鍵步驟在於合併兩個已排序的子串行。為做排序,引入乙個輔助過程merge(a,p,q,r),其中a是陣列,p,q,r是下標,滿足p<=q

const int maxint = (1<<31)-1;

templatevoid merge(t* a, int p, int q, int r)

// 記得**記憶體

delete l;

delete r;

}templatevoid mergesort(t* a, int p, int r)

}

這個排序演算法實現起來雖然比前兩個演算法複雜,但效率也高很多,歸併排序的時間複雜度是o(nlgn)。

排序演算法一

3個簡單的排序演算法,不多解釋了,直接上 include include void display int a,int n printf n void exchange int a,int i,int j 氣泡排序 void popsort int a,int n end for j printf ...

排序演算法(一)

氣泡排序 基本思想 在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉 較小的往上冒。即 每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。氣泡排序的示例 演算法實現 void print int arr,int size...

演算法 排序一

排序在商業資料處理和現代科學計算中的重要性不言而喻。它能夠應用於日常事物處理 組合優化 天體物理學 分子動力學 語言學 基因組學 天氣預報和其他相關領域。20世紀科學與工程領域的十大演算法之一就是一種排序演算法 快速排序。在標準庫中已經實現排序函式,再學習排序演算法仍有重要實際意義。再重溫排序演算法...