三 排序演算法

2021-10-02 07:20:27 字數 1900 閱讀 1228

所有例子都是公升序排序。

資料分成兩部分:已排序和待排序。

排序過程中,資料移動分為兩種:

1. 直接移動:移動資料的儲存位置,消耗時間

2. 邏輯移動:改變指向這些資料的指標

特點:遍歷待排序資料,把最小值與起始資料(最左邊)交換位置

次數:第一輪n-1次,第k輪n-k次

步驟:1. 如果待排序資料大於0,則迴圈2,3

2. 從待排序的資料取第乙個值data[i](前面的i-1個資料已經排好了)

3. 如果data[i]>data[i+n]則交換(即從待排序的資料中找到最小值,放到i那個位置上)

char temp;

char data[5]=;

int n = sizeof(data);

for(int i=0; i data[j]) }}

特點:從左邊開始,對比相鄰兩個資料,根據大小調整順序,慢慢把比較大的數移動到右邊

次數:第一輪n-1次,第k輪n-k次

步驟:1. 如果待排序資料大於0,則迴圈2,3

2. 從待排序的資料取第乙個值data[i]和data[i+1]

3. 如果data[i]>data[i+1]則交換,把正在比較的值向後移動一位(右邊是已排序部分)

char temp;

char data[5]=;

int n = sizeof(data);

for(int i=n-1; i>=0; i–) }}

特點:簡單,需要很大的陣列

步驟:1. 定義陣列,初始值為0

2. 從待排序的資料取值,陣列中對應下標的資料加1

3. 把陣列的下標的值取出來

char temp[8]=;

char data[5]=;

int n = sizeof(data);

for(int i=0; i 0)

}特點:把未排序資料取出,插入已排序的資料的響應位置

步驟:1. 從待排序的資料中取出乙個

2. 從右往左與已排序的資料比較,如果小於,則繼續比較,直到大於時,確定插入位置

3. 已排序的資料中,插入位置右邊的資料要整體右移一位

4. 資料插入指定位置

或者1. 從待排序的資料中取出乙個

2. 向左邊的資料比較,如果小於,交換,直到大於時

char data[5]=;

int n = sizeof(data);

for(int i=i; i=0; i–)

data[j] = temp;

break;}}

}特點:未排序資料中任選乙個基準資料,以資料為分割點,小於基準的放左邊,大基準的放右邊。再對基準兩邊是資料進行同樣的操作,直到只剩下乙個數。(其實是使用遞迴)

步驟:1. 選取基準點

2. 小於放左邊,大於放右邊

3. 一直到分組後,每組只有一位

4. 從左向右找ki,使得ki>k

5. 從右向左找kj,使得kj=j,k和kj互換,並已j為基準點分割成兩部分,對左右兩邊排序,直到左半邊的值等於右半邊

特點:把目標資料分成幾個區域,再對區塊內的資料進行插入排序,再減少間隔。適用於大部分已經排好序的資料

步驟:1. 資料之間的間隔是n/2,第1個和第n/2+1個進行插入排序,第2個和第n/2+2個進行插入排序,以此類推

2. 資料之間的間隔是n/4,第1個、n/4+1, 2n/4, 3n/4個進行插入排序,以此類推

3. 迴圈直到間隔為1

特點:把資料分割為更小的部分進行排序,再把排序好的資料合併

步驟:1. 將n個長度為1的鍵值成對合併成n/2個長度為2的鍵值組

2. 成對合併成n/4個長度為4的鍵值組

3. 一直到n個長度為1的鍵值

不進行元素之間的直接比較,按比較方向分為最高位優先msd和最低位優先lsd。msd從最左邊的位數開始比較

演算法基礎(三) 排序

我們先來看看幾種排序的結構圖 排序是否穩定 比如 排序前 25 7 6 4 29 3 排序後 22 3 4 5 6 7 9 排序前藍2在紅 2前面,排序後藍 2依然在紅 2前面,則所用的排序方法是穩定的。如果排序後,紅 2有可能在藍 2前面,那麼所用的排序方法是不穩定的 下面說說前面幾種排序的時間複...

(三)排序演算法之選擇排序

選擇排序和之前說的氣泡排序和插入排序套路差不多,都是將陣列分隔為已排序和未排序子陣列,主要區別在於元素選取和放入。選擇排序是從未排序陣列中選最小 或最大 的乙個放入已排序的陣列後。下面用 分隔已排序和未排序陣列,如 待排序資料 7,0,2,8,1 一開始有序陣列是空的 一次排序 0 7,2,8,1 ...

STL 常用演算法(三)排序演算法

演算法簡介 功能描述 函式原型 include include void myprint int val void test01 intmain 函式原型 include include include class myprint void test01 for each v.begin v.end...