排序演算法的複雜度和穩定性

2021-06-27 12:28:09 字數 2177 閱讀 4132

本文簡單介紹幾種面試中常用的排序演算法,並對每個演算法的時間複雜度、空間複雜度、穩定性進行分析。

(1) 氣泡排序

void swap(int& num1, int& num2)

void bubblesort(int array, int size)

} }}int main(int argc, const char* argv)

;

bubblesort(a, 10);

for (int i=0; i

時間複雜度o(n^2),空間複雜度o(1)。

(2) 選擇排序

(3) 插入排序

(4) 快速排序

void quicksort(int* num, int start, int endend)

}/* 從後往前找比value小的數 */

for (; i < j; j--)

} }num[i] = value;

quicksort(num, start, i-1);

quicksort(num, i+1, end);

}void printarray(int* num, int start, int end)

cout << endl;

}int main(int argc, char* argv);

quicksort(array, 0, 9);

printarray(array, 10);

return 0;

}

(5) 堆排序

堆排序是指利用堆積樹(堆)這種資料結構所設計的一種排序演算法。

堆分為大根堆和小根堆,兩者都是完全二叉樹(完全二叉樹的知識請自行學習)。大根堆的要求就是每個節點的值都不大於其父節點的值,即 node->parent->value >= node->value。小根堆則於此相反,每個節點的值都不小於其父節點的值。因為大根堆和小根堆的性質相似,本文僅以大根堆為例進行討論。

由大根堆的性質可知,一組數列如果為大根堆的話,那數列的最大值肯定在堆頂。堆排序就是利用此性質,不斷構建大根堆,不斷選取最大值以進行數列排序。具體過程如下:

(1) 將一組長度為n的無序數列k0, k1, k2, ..., kn-1構建成大根堆。

一言以敝之,就是將無序的待排序數列轉換成

/* 交換兩個數 */

void swap (int* a, int *b)

/* 構建最大堆 */

void buildheap(int array, int size)

i--;

} for (; i > 0; i-=2) }}

/* 最大堆排序 */

void heapsort(int array, int size)}

int main(int argc, const char* argv);

heapsort(a, 10);

for (int i=0; i

(6) 歸併排序

先把**貼上來,有時間再將此帖寫完

/* 將有序陣列 source[start, ..., mid] 和 有序陣列 source[mid+1, ..., end]

* 合併成乙個有序陣列,並將合併的有序陣列寫回source中 */

void merge(int source, int target, int start, int mid, int end)

else }

while (i <= mid)

while (j <= end)

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

}/* 歸併排序 */

void mergesort(int source, int target, int start, int end)

}int main(int argc, char* argv)

; int* b = new int[10];

mergesort(a, b, 0, 9);

for (int i=0; i

演算法複雜度與穩定性

時間複雜度是乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行 測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就...

常用排序演算法複雜度和穩定性總結

排序演算法 平均時間複雜度 最好情況 最壞情況 空間複雜度 穩定性氣泡排序 o n2 o n o n2 o 1 穩定選擇排序 o n2 o n2 o n2 o 1 不穩定插入排序 o n2 o n o n2 o 1 穩定希爾排序 o nlogn o n2 o n2 o n2 o 1 不穩定歸併排序 ...

常用排序演算法 穩定性和複雜度分析

這次簡單的記錄一下演算法的穩定性以及複雜度 如果兩個相等的資料的先後位置,排序前後保持不變的話,那就是穩定的,反之,就是不穩定 例如 a i a j a i 的位置在a j 之前,排序後,a i 的位置依然在a j 之前 1 如果排序演算法是穩定的,那麼從乙個鍵上排序,然後再從另乙個鍵上排序,第乙個...