各排序演算法總結及實現

2021-08-21 15:13:01 字數 2856 閱讀 8123

####1. 插入排序(insertsort)

插入排序通過把序列中的值插入乙個已經排序好的序列中,直到該序列的結束。插入排序是對氣泡排序的改進。它比氣泡排序快2倍。適用於資料在1000一下的場合下使用插入排序,或者重複排序不超過200資料項的序列。

//遍歷陣列,遍歷到i時,a0,a1…ai-1是已經排好序的,取出ai,從ai-1開始向前和每個比較大小,如果小於,則將此位置元素向後移動,繼續先前比較,如果不小於,則放到正在比較的元素之後。可見相等元素比較是,原來靠後的還是拍在後邊,所以插入排序是穩定的。

void insertion_sort (int a, int n) 

a[j + d] = temp;}}

}

####3.選擇排序

選擇排序是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。

//遍歷陣列,遍歷到i時,a0,a1…ai-1是已經排好序的,然後從i到n選擇出最小的,記錄下位置,如果不是第i個,則和第i個元素交換。此時第i個元素可能會排到相等元素之後,造成排序的不穩定。

void selection_sort (int a, int n) }}

####4.堆排序

堆排序適合於資料量非常大的場合(百萬資料)。

堆排序不需要大量的遞迴或者多維的暫存陣列。這對於資料量非常巨大的序列是合適的。比如超過數百萬條記錄,因為快速排序,歸併排序都使用遞迴來設計演算法,在資料量非常大的時候,可能會發生堆疊溢位錯誤。

堆排序會將所有的資料建成乙個堆,最大的資料在堆頂,然後將堆頂資料和序列的最後乙個資料交換。接下來再次重建堆,交換資料,依次下去,就可以排序所有的資料。

//調整為大頂堆(上移和調整)

void heapadjust(int a, int i, int nlength)

else

// 否則退出迴圈

break;

}}// 堆排序演算法

void heap_sort(int a,int length)

}

####5.氣泡排序

氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是o(n^2)的演算法。

void bubblesort(int *a, size_t size)

} if (count == 0)//當一次交換都沒有的時候,序列有序,跳出迴圈}}

####6.快速排序

快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。

快速排序比大部分排序演算法都要快。儘管我們可以在某些特殊的情況下寫出比快速排序快的演算法,但是就通常情況而言,沒有比它更快的了。快速排序是遞迴的,對於記憶體非常有限的機器來說,它不是乙個好的選擇。

//快速排序首先找到乙個基準,下面程式以第乙個元素作為基準(pivot),然後先從右向左搜尋,如果發現比pivot小,則和pivot交換,然後從左向右搜尋,如果發現比pivot大,則和pivot交換,一直到左邊大於右邊,此時pivot左邊的都比它小,而右邊的都比它大,此時pivot的位置就是排好序後應該在的位置,此時pivot將陣列劃分為左右兩部分,可以遞迴採用該方法進行。快排的交換使排序成為不穩定的。

int mpartition(int a, int l, int r)  else if (j > high)  else if (a[j] < a[i])  else 

}for (int k = low; k < n; k++)

}

//將有二個有序數列a[first...mid]和a[mid...last]合併。

void mergearray(int a, int first, int mid, int last, int temp)

while (i <= m)

temp[k++] = a[i++];

while (j <= n)

temp[k++] = a[j++];

for (i = 0; i < k; i++)

a[first + i] = temp[i];

}void mergesort(int a, int first, int last, int temp)//分解複雜度o(logn)}

bool mergesort(int a, int n)

#define radix_10 10 //十個桶,表示每一位的十個數字

#define keynum 5 //整數字數

void radix_sort(int* pdataarray, int idatanum)

for (int pos = 1; pos <= keynum; pos++) //從個位開始到31位

for (int i = 0, j =0; i < radix_10; i++) //寫回到原陣列中,復位radixarrays}}

####9. 總結

其中基於插入演算法有:直接插入排序,希爾排序;

基於選擇:直接選擇排序,堆排序;

基於交換:氣泡排序,快速排序;

速度較快的:快速排序,歸併排序,堆排序(還適用於百萬資料量),希爾排序等

下面是乙個總的**,大致總結了我們常見的所有的排序演算法的特點。

各排序演算法總結

下面先來介紹內部排序 內部排序主要有八大排序演算法 氣泡排序,快速排序,直接插入排序,希爾排序,簡單選擇排序,堆排序,歸併排序,基數排序。以下討論均預設為公升序排序。氣泡排序 第一次排序,從第乙個元素到第n 1個,依次比較與下一元素的大小,若比下一元素大則交換兩元素位置。每次排序確定乙個最大值。這樣...

各排序演算法對比

比較名稱 時間複雜度 空間複雜度 是否穩定 是否與序列初始狀態有關 適用情況 儲存結構 備註直接插入排序 最好o n 平均o n 2 最壞o n 2 o 1 是是 n較小 小於等於50 初始狀態基本有序,順序儲存 鏈式儲存 折半插入排序 o n 2 o 1 是比較次數無關 移動次數有關 順序儲存 僅...

各排序演算法效能分析

插入排序 最壞時間始n 2 快速排序和插入排序的區別是 插入排序始將關鍵字插入已排序的子串行中,而快速排序始 對整個檔案,把基準關鍵字放到正確的位置上。快排最壞時間依然是n 2,平均時間始nlgn。在堆排序 的過程中只需乙個輔助空間 所以空間 複雜度為 0 1 堆排序的時間複雜度為 nlgn 由於堆...