插入排序簡介
插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,算法適用於少量數據的排序,時間複雜度爲O(n^2)。
插入排序的模擬過程可以看鏈接:InsertSortion
實現過程
爲了比較容易地理解插入排序,我們可以列出一組數據,比如:
1,5,4,3,7
我列出了兩種方法分別說明插入排序的實現過程,你可以選擇自己喜歡的方法:
第一種
對於插入排序算法來說:
1. 取出一個數:
1
2. 取出第二個數 5
,與 1
比較,比 1
小,插入第二位:
1, 5
3. 取出第三個數 4
,依次與 1,5
比較,所以4插入到第二位中,而 5
向後推:
1, 4, 5
4. 取出第四個數 3
,依次與 1, 4,5
比較,所以3插入到第二位中,而 4, 5
向後推:
1, 3, 4, 5
5 重複以上邏輯:
1, 3, 4, 5, 7
第二種
分析以上過程,我們發現排序算法可以分成兩個步驟:
1. 遍歷數據表,每次取出一個數據,與之前的數據比較。
2. 如果比之前的數據小,插入後將數據都向後推。
代碼實現
下面是插入排序的實現,之後是對代碼實現的簡略說明:
#include <stdio.h>
void print(const int *a, const int length) {
int i;
for (i = 0; i<length; i++) {
printf("%d ", a[i]);
}
putchar('\n');
}
void pushFront(int *a, const int length, const int key) {
//將所有a[j]到a[length]都往後推一格
int tmp = a[length];
for (int i = length; i >key; i--) {
a[i] = a[i-1];
}
a[key] = tmp;
};
void insertSort(int *a, const int length) {
for (int i = 0; i < length; i++) {
for (int j = 0; j < i; j++) {
if (a[i] < a[j]) {
pushFront(a, i, j);
break;
}
}
print(a, i+1);
}
}
void main() {
const int length = 5;
int my_array[5] = { 1,5,4,3,7 };
print(my_array, length);
insertSort(my_array, length);
}
個人分析
- 首先每次都取出一個數,然後與之前的排序好的數據進行比較,所以我們這裏需要用到兩個循環:
for (int i = 0; i < length; i++) {
//取出a[i]
for (int j = 0; j < i; j++) {
if (a[i] < a[j]) {
//當取出的數據小於排序好的數據後,需要將數據插入
//並且將之後的數據都往後推
//需要注意的是,i是現在數據的長度,而j則是插入的位置
pushFront(a, i, j);
break;
}
}
print(a, i+1);
}
- 實現插入代碼
void pushFront(int *a, const int length, const int key) {
//將所有a[j]到a[length]都往後推一格
int tmp = a[length];
//這裏,我使用了從後向前逐漸替換的方法。
//在實現這裏之前,我嘗試了向將插入後的數據放入tmp中,然後依次向後替換,實現方法比較複雜。
for (int i = length; i >key; i--) {
a[i] = a[i-1];
}
a[key] = tmp;
}
代碼精簡
void InsertSort(int *a, const int length){
for(int i=1; i<length; i++){
int tmp = a[i];
int j = i-1;
while(j>=0 && a[j] > tmp){
a[j+1] = a[j];
j--;
}
a[j+1] = tmp;
}
}