二分插入排序(折半插入排序)--排序算法(六)
生活随笔
收集整理的這篇文章主要介紹了
二分插入排序(折半插入排序)--排序算法(六)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
折半插入排序思想
直接插入排序(Straight Insertion Sort)的基本思想是:
直接插入排序就像打牌抓牌一樣,手中的牌都是有序的,當從下面拿起一張牌的時候,與手中的牌比較,然后插入到適當位置。
折半插入(Binary Insert Sort)和直接插入類似,唯一的區別就是在有序列表中比較查找插入位置時用的是二分法。因為前面部分是有序列表,所以是最理想的二分法。
折半插入排序示例
下面選取折半插入排序的一個中間過程對其進行說明。假設{20,30,40,10,60,50}中的前3個數已經排列過,是有序的了;接下來對10進行排列。示意圖如下:
折半插入排序實現
#include <stdio.h> void binaryInsert_sort(int *arr, int n){//i遍歷指針;j找到插入位,將插入為及其后面到達遍歷位的數后移//get每次從后面無序中拿到的數據//left前面有序的首指針,mid前面有序的中間指針,right前面有序的末尾指針int i, j, get, left, mid, right;for(i = 1; i < n; i++){get = arr[i]; //拿到要插入的值left = 0; right = i - 1;while(left <= right){ //前面有序部分的二分插入mid = (left + right)>>1; //每次取中值比較if(arr[mid] < get)left = mid + 1; //中值比插入數據說明在左邊elseright = mid - 1; //反之在右邊}for(j = i - 1; j >= left; j--){ //找到插入位,將元素后移,騰出空間arr[j+1] = arr[j];}arr[left] = get; //插入} } void print(int *arr, int n){int i;for(i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n"); } int main(int argc, char const *argv[]) {int arr[6] = {20, 30, 40, 10, 60, 50};int n = sizeof(arr) / sizeof(int);binaryInsert_sort(arr, n);print(arr, n);return 0; }時間復雜度,空間復雜度,穩定性
- 時間復雜度:
二分插入排序的時間復雜度是O(N2):假設被排序的數列中有N個數,遍歷一趟時間復雜度是O(N),需遍歷多少次呢?N-1次,共n-1 + n-2 + n-3 + … + 1 = n * (n -1) / 2.因此,其時間復雜度是O(N2)。
為什么二分查找還是O(N2)呢?因為不管是二分插入還是折半插入,大頭都在遍歷和元素的后移上,二分查找只能在查找位置上節約時間。 - 空間復雜度:
二分插入排序的空間復雜度是O(1),因為移動元素是需要一個防止被覆蓋的臨時變量。 - 穩定性:
二分插入排序是穩定的算法,它滿足穩定算法的定義:假設在數列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。則這個排序算法是穩定的!
總結
以上是生活随笔為你收集整理的二分插入排序(折半插入排序)--排序算法(六)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: selenium3 + python -
- 下一篇: c盘users的用户名怎么改_做完这几个