所有例子都是公升序排序。
資料分成兩部分:已排序和待排序。
排序過程中,資料移動分為兩種:
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...