排序演算法(一):直接插入排序
阿新 • • 發佈:2018-11-26
1.插入排序—直接插入排序(Straight Insertion Sort)
基本思想:
將一個記錄插入到已排序好的有序表中,從而得到一個新,記錄數增1的有序表。即:先將序列的第1個記錄看成是一個有序的子序列,然後從第2個記錄逐個進行插入,直至整個序列有序為止。
要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用。
直接插入排序示例:
如果碰見一個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,從原無序序列出去的順序就是排好序後的順序,所以插入排序是穩定的。
#include <stdio.h> #include <iostream> using namespace std; void print(int a[], int n ,int i) { cout<<i <<":"; for(int j= 0; j<8; j++) { cout<<a[j] <<" "; } cout<<endl; } void InsertSort(int a[], int n) { int i, j, x; for(i= 1; i<n; i++) { if(a[i] < a[i-1]){ //若第i個元素大於i-1元素,直接插入。小於的話,移動有序表後插入 j= i-1; x = a[i]; //複製為哨兵,即儲存待排序元素 a[i] = a[i-1]; //先後移一個元素 while((j >= 0) && (x < a[j])) { //查詢在有序表的插入位置 a[j+1] = a[j]; j--; //元素後移 } a[j+1] = x; //插入到正確位置 } print(a,n,i); //列印每趟排序的結果 } } int main() { int a[8] = {3,1,5,7,2,4,9,6}; InsertSort(a,8); return 0; }
優點:
缺點:
優化: