冒泡排序: 主要原理是每次兩兩比較,大的往下沉。代碼實現(xiàn)如下:
void BubbleSort(int array[], int len) {
bool isSwap;
for (int i = 0; i < len; i++) {
isSwap = false;
for (int j = 0; j < len - 1 - i; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
isSwap = true;
}
}
if (!isSwap) {
break;
}
}
}
選擇排序:每一次從待排序的數(shù)據(jù)元素中選出最小的一個元素,存放在序列的起始位置,直到全部待排序的元素排完。代碼實現(xiàn)如下:
void SelectionSort(int array[], int len) {
int index;
for (int i = 0; i < len - 1; i++) {
index = i;
for (int j = i + 1; j < len; j++) {
if (array[index] > array[j]) {
index = j;
}
}
if (index != i) {
int temp = array[i];
array[i] = array[index];
array[index] = temp;
}
}
}
插入排序:每步將一個待排序的記錄,按其關(guān)鍵碼的大小插入前面已經(jīng)排序的隊列適當(dāng)位置上,直到全部插入完為止。代碼實現(xiàn)如下:
void InsertSort(int array[], int len) {
for (int i = 1; i < len; i++) {
int temp = array[i];
int j = i;
while (array[j - 1] > temp && j > 0) {
array[j] = array[j - 1];
j--;
}
array[j] = temp;
}
}
桶排序:簡單的桶排序,適用于正整數(shù)且上界不大的數(shù)組排序。此處的映射直接是線性的。代碼實現(xiàn)如下:
void BucketSort(int array[], int len) {
int bucket[MAX];
memset(bucket, 0, sizeof(bucket));
for (int i = 0; i < len; i++) {
bucket[array[i]]++;
}
int k = 0;
for (int j = 0; j < MAX; j++) {
while (bucket[j]--) {
array[k++] = j;
}
}
}
快速排序:快速排序是找出一個元素(理論上可以隨便找一個,一般都會選擇第一個)作為基準(zhǔn)(pivot),然后對數(shù)組進(jìn)行分區(qū)操作,使基準(zhǔn)左邊的值都不大于基準(zhǔn)值,其基準(zhǔn)右邊的元素值都不小于基準(zhǔn)值,如此作為基準(zhǔn)的元素調(diào)整到排序后的正確位置,遞歸快速排序,將其他n-1個元素也調(diào)整到排序后的正確位置。最后每個元素都是在排序后的正確位置,排序完成。所以快速排序算法的核心算法是分區(qū)操作,即如何調(diào)整基準(zhǔn)的位置以及調(diào)整返回基準(zhǔn)的最終位置以便分治遞歸。例如:
2 4 9 3 6 7 1 5 首先用 2 當(dāng)作基準(zhǔn), 使用 i j 兩個指針分別從兩邊進(jìn)行掃描, 把比 2 小的元素和比 2 大的元素分開。 首先比較 2 和 5, 5 比 2 大, j 左移
2 4 9 3 6 7 1 5 比較 2 和 1, 1 小于 2, 所以把 1 放在 2 的位置
1 4 9 3 6 7 1 5 比較 2 和 4, 4 大于 2, 因此將 4 移動到后面
1 4 9 3 6 7 4 5 比較 2 和 7, 2 和 6, 2 和 3, 2 和 9, 全部大于 2, 滿足件,因此不變
經(jīng)過第一輪的快速排序, 元素變?yōu)橄旅娴臉幼?br>
[1] 2 [9 3 6 7 4 5]
代碼實現(xiàn)如下:
void QuickSort(int array[], int left, int right) {
if (left < right) {
int key = array[left];
int low = left;
int high = right;
while (low < high) {
while (low < high && array[high] >= key) {
high--;
}
array[low] = array[high];
while (low < high && array[low] <= key) {
low++;
}
array[high] = array[low];
}
array[low] = key;
QuickSort(array, left, low - 1);
QuickSort(array, low + 1, right);
}
}