插入排序是一種簡單直觀的排序算法。它的工作原理非常類似于我們抓撲克牌。
對于未排序數據(右手抓到的牌),在已排序序列(左手已經排好序的手牌)中從后向前掃描,找到相應位置并插入。
插入排序在實現上,通常采用in-place排序(即只需用到O(1)的額外空間的排序),因而在從后向前掃描過程中,需要反復把已排序元素逐步向后挪位,為最新元素提供插入空間。
具體算法描述如下:
1、從第一個元素開始,該元素可以認為已經被排序
2、取出下一個元素,在已經排序的元素序列中從后向前掃描
3、如果該元素(已排序)大于新元素,將該元素移到下一位置
4、重復步驟3,直到找到已排序的元素小于或者等于新元素的位置
5、將新元素插入到該位置后
重復步驟2~5
代碼如下:
// 插入排序法
void Insert (int* a, int len)
{int i, j, get;// 從數組第二個開始向后遍歷,和他之前的比較并找到插入的位置for (i = 1; i < len; i++){get = a[i]; // 保存要插入的數j = i-1; // 比較對象從他前一位開始// 找到比他小的,并且進行移位while (j >= 0 && a[j] > get){a[j+1] = a[j];j--;}a[j+1] = get; // 插入元素}
}
對于插入排序,如果比較操作的代價比交換操作大的話,可以采用二分查找法來減少比較操作的次數,我們稱為二分插入排序。
代碼:
// 二分插入排序法
void Half_Insert (int* a, int len)
{int i; // 從數組第二個開始向后遍歷,和他之前的比較并找到插入的位置for (i = 1; i < len; i++){int left = 0;int right = i - 1;int get = a[i];// 縮小范圍,直到找到插入的位置while (left <= right){int mid = (right+left) / 2;if (a[mid] > get){right = mid - 1;}else{left = mid + 1;} }// 移位int j;for (j = i-1; j >= left; j--){a[j+1] = a[j];}a[left] = get; // 插入元素 }
}