日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

二分插入排序(折半插入排序)--排序算法(六)

發(fā)布時(shí)間:2023/12/9 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二分插入排序(折半插入排序)--排序算法(六) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

折半插入排序思想

直接插入排序(Straight Insertion Sort)的基本思想是:

  • 把n個(gè)待排序的元素看成為一個(gè)有序表和一個(gè)無(wú)序表。開始時(shí)有序表中只包含1個(gè)元素,無(wú)序表中包含有n-1個(gè)元素。
  • 排序過(guò)程中每次從無(wú)序表中取出第一個(gè)元素,將它插入到有序表中的適當(dāng)位置,使之成為新的有序表,
  • 重復(fù)n-1次可完成排序過(guò)程。
    直接插入排序就像打牌抓牌一樣,手中的牌都是有序的,當(dāng)從下面拿起一張牌的時(shí)候,與手中的牌比較,然后插入到適當(dāng)位置。
  • 折半插入(Binary Insert Sort)和直接插入類似,唯一的區(qū)別就是在有序列表中比較查找插入位置時(shí)用的是二分法。因?yàn)榍懊娌糠质怯行蛄斜?#xff0c;所以是最理想的二分法。

    折半插入排序示例

    下面選取折半插入排序的一個(gè)中間過(guò)程對(duì)其進(jìn)行說(shuō)明。假設(shè){20,30,40,10,60,50}中的前3個(gè)數(shù)已經(jīng)排列過(guò),是有序的了;接下來(lái)對(duì)10進(jìn)行排列。示意圖如下:

    折半插入排序?qū)崿F(xiàn)

    #include <stdio.h> void binaryInsert_sort(int *arr, int n){//i遍歷指針;j找到插入位,將插入為及其后面到達(dá)遍歷位的數(shù)后移//get每次從后面無(wú)序中拿到的數(shù)據(jù)//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; //中值比插入數(shù)據(jù)說(shuō)明在左邊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; }

    時(shí)間復(fù)雜度,空間復(fù)雜度,穩(wěn)定性

    • 時(shí)間復(fù)雜度:
      二分插入排序的時(shí)間復(fù)雜度是O(N2):假設(shè)被排序的數(shù)列中有N個(gè)數(shù),遍歷一趟時(shí)間復(fù)雜度是O(N),需遍歷多少次呢?N-1次,共n-1 + n-2 + n-3 + … + 1 = n * (n -1) / 2.因此,其時(shí)間復(fù)雜度是O(N2)。
      為什么二分查找還是O(N2)呢?因?yàn)椴还苁嵌植迦脒€是折半插入,大頭都在遍歷和元素的后移上,二分查找只能在查找位置上節(jié)約時(shí)間。
    • 空間復(fù)雜度:
      二分插入排序的空間復(fù)雜度是O(1),因?yàn)橐苿?dòng)元素是需要一個(gè)防止被覆蓋的臨時(shí)變量。
    • 穩(wěn)定性:
      二分插入排序是穩(wěn)定的算法,它滿足穩(wěn)定算法的定義:假設(shè)在數(shù)列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。則這個(gè)排序算法是穩(wěn)定的!

    總結(jié)

    以上是生活随笔為你收集整理的二分插入排序(折半插入排序)--排序算法(六)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。