排序:即將一組混亂的數據按從小到大或者從大到小的順序進行有序的排列出來。
插入排序算法圖解:
思路解答:
它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,通常採用 in-place 排序(即只需用到 O(1)的額外空間的排序),因而在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,爲最新元素提供插入空間。
具體算法描述如下:
- 從第一個元素開始,該元素可以認爲已經被排序;
- 取出下一個元素,在已經排序的元素序列中從後向前掃描;
- 如果該元素(已排序)大於新元素,將該元素移到下一位置;
重複步驟 3,直到找到已排序的元素小於或者等於新元素的位置; - 將新元素插入到該位置;
重複步驟 2~5。
時間複雜度: O(n2)
代碼實現:
#include <iostream>
#include <Windows.h>
using namespace std;
// 插入排序
void InsertSort(int *beauties, int len) {
if (!beauties) {
return;
}
int index; // 存儲待比較的的索引
int ret; // 保存待插入數據
for (int i = 1; i < len; i++) {
index = i - 1; // 保存待插入數據的前一個數據的索引
ret = beauties[i]; // 保存待插入數據
// 當索引大於等於零,且所有對應的數值大於待插入數據
while (index >= 0 && beauties[index] > ret) {
beauties[index + 1] = beauties[index]; // 將當前索引的數值往後移動一個位置
index--; // 索引減一
}
// 當索引爲-1或者索引對應的值要比ret小時,就可以退出循環,ret就可以插入到索引加一的位置了
beauties[index + 1] = ret;
}
}
int main(void) {
int beauties[] = { 154, 166, 157, 174, 162, 159, 160, 161, 171 };
// 獲取數組的長度
int len = sizeof(beauties) / sizeof(beauties[0]);
InsertSort(beauties, len);
for (int i = 0; i < len; i++) {
cout << beauties[i] << ", ";
}
cout << endl;
system("pause");
return 0;
}
運行截圖: