####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 由於堆...