排序演算法可以分為內部排序和外部排序, 內部排序是資料記錄在記憶體中進行排序, 而外部排序是因為排序的資料很大, 一次不能容納全部的排序記錄, 在排序過程中需要訪問外存.
常見的內部排序演算法有: 氣泡排序、選擇排序、插入排序、希爾排序、歸併排序、快速排序、堆排序等.
介紹氣泡排序是一種簡單的排序演算法, 這個演算法的名字由來是因為越小的元素會經由交換慢慢」浮」到數列的頂端. 氣泡排序的時間複雜度為o(n^2). 氣泡排序是與插入排序擁有相等的執行時間, 但是兩種演算法在需要的交換次數卻很大地不同. 在最好的情況, 氣泡排序需要o(n^2)次交換,而插入排序只要最多o(n)交換.
複雜度和穩定性
最差時間複雜度 o(n^2)
最優時間複雜度 o(n)
平均時間複雜度 o(n^2)
最差時間複雜度 o(n) total, o(1) auxiliary
穩定性 穩定
步驟取nums[0], 與nums1進行比較, 如果nums[0]大於nums1, 那麼nums[0]與nums1交換位置
重複步驟1的操作, 兩兩比較移動, nums1和nums2, nums2和nums3, 直到將最大的數移動到n-1的位置
重複步驟1和2, 將第二大的數移動到n-2的位置, 第三大的數移動到n-3的位置, 以此類推, 直到將第n-2大的數移動到1的位置, 最小的數在0位置不動
可以結合步驟看看示意圖, 加強理解
}介紹
選擇排序的主要優點與資料移動有關. 如果某個元素位於正確的最終位置上, 則它不會被移動. 選擇排序每次交換一對元素, 它們當中至少有乙個將被移到其最終位置上, 因此對n個元素的表進行排序總共進行至多n-1次交換. 在所有的完全依靠交換去移動元素的排序方法中, 選擇排序屬於非常好的一種.
複雜度最差時間複雜度 o(n^2)
最優時間複雜度 o(n^2)
平均時間複雜度 o(n^2)
最差空間複雜度 o(n) total, o(1) auxiliary
穩定性 穩定
步驟從未排序數列中取起始位置的元素, 比較未排序數列找出最小的元素, 並放置在未排序數列的起始位置上
重複步驟1, 直到未排序數列只有乙個元素
可以結合步驟看看示意圖, 加強理解
**
void selection_sort(int arr, int len) }}
介紹
插入排序在實現上, 通常採用in-place排序(即只需用到o(1)的額外空間的排序), 因而在從後向前掃瞄過程中, 需要反覆把已排序元素逐步向後挪位, 為最新元素提供插入空間.
複雜度最差時間複雜度 o(n^2)
最優時間複雜度 o(n)
平均時間複雜度 o(n^2)
最差空間複雜度 o(n) total, o(1) auxiliary
穩定性 穩定
步驟從第乙個元素開始, 該元素可以認為已經被排序好
取出下乙個元素, 在已經排序的元素序列中從後向前掃瞄
如果該元素( 已經排序 )大於新元素, 將該元素移動到下乙個位置
重複步驟3, 知道找到已經排序的呀un蘇小於或者等於新元素的位置
將新元素插入到該位置後面
重複步驟2~5
可以結合步驟看看示意圖, 加強理解
}介紹
希爾排序, 也稱遞減增量排序演算法, 實質是分組插入排序. 希爾排序的基本思想是: 在每一組數列中對列分別進行插入排序, 重複這個過程, 不過每次用更長的列( 或者說更小的組 )來進行.
複雜度和穩定性
最壞時間複雜度 o(n^2)
最優時間複雜度 o(n^1.3)
平均時間複雜度 o(nlogn) ~ o(n^2)
最壞空間複雜度 o(n) total, o(1) auxiliary
穩定性 不穩定
步驟初始化步長陣列
根據步長陣列給數列分組, nums[0]~nums[t-1], nums[t]~nums[2t-1], nums[2t]~nums[3t-1]… …
對數列分組進行列的插入排序, nums[0], nums[t], nums[2t]. nums1, nums[t+1], nums[2t+1]… …
重複步驟2~步驟3, 知道步長為1
可以結合步驟看看示意圖, 加強理解
}介紹
歸併排序是建立在歸併操作上的一種有效的排序演算法, 該演算法是採用分治法的乙個非常典型的應用, 且各層分治遞迴可以同時進行.
時間複雜度和穩定性
最差時間複雜度 o(nlogn)
最優時間複雜度 o(n)
平均時間複雜度 o(nlogn)
最差時間複雜度 o(n) total
穩定性 穩定
步驟申請空間, 使其大小為兩個已經排序序列之和, 該空間用來存放合併後的序列
設定兩個指標, 最初位置分別為兩個已經排序序列的起始位置
比較兩個指標所指向的元素, 選擇相對小的元素放入到合併空間, 並移動指標到下乙個位置
重複步驟3知道某個指標到達串行列尾
將另乙個序列剩下的所有元素直接複製到合併串行列尾
可以結合步驟看看示意圖, 加強理解
}介紹
快速排序使用分治法策略來把乙個序列分為兩個子串行.
時間複雜度和穩定性
最差時間複雜度 o(n^2)
最優時間複雜度 o(nlogn)
平均時間複雜度 o(nlogn)
最差空間複雜度 根據實現的方式不同而不同
穩定性 不穩定
步驟從數列中跳出乙個元素, 稱為」基準」
重新排列數列, 所有比基準小的元素放在基準前面, 所有比基準大的元素放在基準後面( 相同的數可以放在任意一邊 ). 在這個分割槽結束後, 該基準就處於數列的中間位置. 這個稱為分割槽操作.
遞迴地把小於基準值元素的子數列和大於基準值元素的子數列進行排序
可以結合步驟看看示意圖, 加強理解
**
//交換位置
void swap(int *a , int *b)
//分治
int partition(int *ary, int len , int pivot_i )
static void shift_up(int i)
else
i = (i-1)/2;
}}static void shift_down(int i)
if (heap[(i-1)/2] < heap[i])
else
}}
static void delete(int i)
int delete_max()
void insert(int new_data)
排序演算法詳解
直接插入 二分插入 希爾排序 氣泡排序 快排 簡單選擇 堆排序 歸併排序 基數排序 總結 一 穩定性 穩定 氣泡排序 插入排序 歸併排序和基數排序 不穩定 選擇排序 快速排序 希爾排序 堆排序 二 平均時間複雜度 o n 2 直接插入排序,簡單選擇排序,氣泡排序。在資料規模較小時 9w內 直接插入排...
排序演算法 詳解堆排序演算法
1 原理 堆排序是一種選擇排序,通過實現大小堆,來取出堆頂的資料,然後和最後乙個交換,然後將堆的大小減一,迴圈這個過程直到,只有乙個資料時停止。公升序建大堆,降序建小堆。2 問題 很多人會疑惑為什麼要交換之後再減小堆的大小呢?難道不交換就不能篩選出我們要的極值嗎?首先向下調整演算法的時間複雜度為o ...
排序演算法 詳解希爾排序演算法
希爾排序實際上是一種插入排序的優化,希爾排序的目的是先進行預排序,使陣列更加的有序,將需要排序的陣列分成n gap個大小為gap的子陣列,對子樹組進行插入排序。當gap等於1時,就相當於直接插入排序了。例如 9 8 7 6 5 4 3 2 1 排公升序 直接插入排序需要 45次 用希爾排序 時間複雜...