十大排序演算法速記總結

2022-09-28 23:39:23 字數 2604 閱讀 5815

選取第乙個數為哨兵

將比哨兵小的數都交換到前面,比哨兵大的數都交換到後面

返回哨兵位置,根據哨兵位置劃分左右區間重複第二步,直到各區間只有乙個數。

int partition(vector&nums, int left, int right)

// 再找左邊,只要左邊的數<=哨兵就繼續

while(i < j && nums[i] <= key)

swap(nums[i], nums[j]); // // 走到這步時,一定有nums[i] > nums[left] 而nums[j] < nums[left],為了nums[i] < nums[j] 所以要進行交換

}swap(nums[i], key); // 最後將哨兵放到正確的位置上,完成一次partition

return i; // 最後返回哨兵所在位置

}void quicksort(vector&nums, int left, int right)

將陣列劃分為左右兩個區間,區間內再劃分左右區間,直到左右區間中只有乙個元素(劃分),通過遞迴實現

對左右區間元素進行合併, 也就是merge的過程、

merge的思想是設定乙個長度為左右兩區間長度和的輔助陣列,設定兩個指標分別從左子區間和右子區間的起始處開始,比較這兩個指標指向的元素,誰更小就把誰放到輔助陣列中,同時該指標+1。

當某個區間的指標已經走到頭時,跳出迴圈。將剩餘的沒有走到頭的區間的元素全部搬到輔助陣列中。

將輔助陣列中的元素更新到原陣列中。完成一次合併排序。

void merge(vector&nums, int left, int mid, int right)

else

}while(i <= mid)

while(j <= right)

for(int i = 0; i < tmp.size(); i++)

}void mergesort(vector&nums, int left, int right)

思想: 堆是用陣列構建的,乙個節點i它的左右子節點在陣列中的位置分別為2 * i + 1, 2 * i + 2。

首先建立乙個堆,然後每次從堆中拿出堆頂元素與陣列的最後乙個元素交換,再對堆進行調整,迴圈n次,可以得到排序後的陣列。

// 小根堆

void sift(vector&nums, int index, int size)

if(nums[i] < nums[j]) break;

else

}}void heapsort(vector&nums)

// 排序,重複移走堆頂元素,再調整堆

for(int i = 0; i < n; i++)

}

氣泡排序就是把小(或大)的元素往前調,比較的是相鄰兩個元素,交換也發生在這兩個元素之間。

比較相鄰的元素,如果第二個比第乙個大,就交換他們兩個。

對每一對相鄰的元素執行步驟一,從開始到結尾,最後乙個元素會是最大的數。

每次對越來越少的元素重複上面的步驟

void bubblesort(vector&nums)}}

}

每一步將乙個待排序的資料插入到前面已經排好序的有序序列中,直到插完所有元素為止。

初始有序序列為陣列第乙個元素

void insertsort(vector&nums)

nums[j + 1] = nums[j];

}nums[j + 1] = key;

}}

希爾排序是對直接插入排序的改進,採用插入排序的方法,先讓陣列中任意間隔為h的元素有序,剛開始h=n/2,接著讓h=n/4,讓h一直縮小,當h=1時,也就是此時陣列中任意間隔為1的元素有序。

排序完成。

void shellsort(vector& nums)

nums[j + dis] = key;}}

}

思想:給每個位置選擇當前元素最小的

在未排序的陣列中找到最大(小)元素,存放到排序序列的起始位置

從剩餘未排序的元素中繼續找最大(小)元素放到已排序序列的末尾

重複直到所有元素均排序

void selectsort(vector&nums)

}swap(nums[i], nums[maxindex]);

}}

思想:利用額外的陣列空間,但是元素需要在0~k之間,不能小於0

首先找到待排序陣列中最大和最小的元素,以最大元素值為長度構建輔助陣列

統計待排序陣列中每個值出現的次數,以值為下標,次數為值放入輔助陣列中

遍歷輔助陣列,從中按順序拿出陣列值(出現次數)不為0的下標,每拿一次,次數減一,直到為0

拿出所有後排序完成。

本質是將值轉化為陣列索引進行排序。

將陣列分到有限數量的桶裡,每個非空的桶再分別排序,從不是空的桶子裡把元素再拿出來放回原來序列中。

也是一種桶排序,將整數按位數切分為不同的數字(個位, 十位,百位...),從最低為開始,依次進行桶排序。

所有位數字排序完成後,排序完成

總結:計數排序,桶排序和基數排序都用到了同的概念,

十大排序演算法

1.非線性時間類排序 時間複雜度未突破 0 nlog 2n 不穩定的四個排序演算法 選擇排序 0 n2 希爾排序 0 n1.3 希爾排序實現python 快速排序 0 n log2 n 0 nlog 2n 0 nlog 2 n 快速排序實現c python 堆排序 0 n log2 n 0 nlog...

十大排序演算法

排序規則 從左至右依次增大 一 基於比較的排序演算法 插入排序 逐個遍歷未排序序列,將其在已排序序列中從右到左比較,直到遇到比自己小的數,然後將元素插入到那個數的後面,有序序列從左向右生長。選擇排序 在未排序序列中選擇最小的元素,將其插入到已排序序列的末尾,有序序列從左向右生長。氣泡排序 從左至右逐...

十大排序演算法

github 排序演算法是 資料結構與演算法 中最基本的演算法之一。排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序演算法有 插入排序 希爾排序 選擇排序 氣泡排序 歸併排序...