C 八種基本排序 插入排序(3)

2021-10-02 15:00:46 字數 2438 閱讀 6607

直接插入排序

原理:

將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的、個數加一的有序資料,演算法適用於少量資料的排序。

思想:

將陣列的第乙個數認為是有序陣列,從前往後(或者從後往前)掃瞄該有序陣列,把陣列中其餘n-1個數,根據數值的大小,插入到有序陣列中,直至陣列中的所有數有序排列為止。

**直接插入排序:

演算法分析

當初始序列為正序時,只需要外迴圈n-1次,每次進行一次比較,無需移動元素。此時比較次數(cmin)和移動次數(mmin)達到最小值。

cmin=n-1

mmin=0

此時時間複雜度為o(n);

當初始序列為反序時,需要外迴圈n-1次,每次排序中待插入的元素都要和[0,i-1]中的i個元素進行比較且要將這i個元素後移i次,加上tmp=arr[i]與arr[j]=temp的兩次移動,每趟移動次數為i+2,此時比較次數和移動次數達到最大值。

cmax = 1+2+…+(n-1) = n(n-1)/2=o(n2)

mmax = (1+2)+ (2+2)+…+(n-1+2)=(n-1)(n+4)/2=o(n2)

此時時間複雜度o(n2)

相同元素的相對位置不變,如果兩個元素相同,插入元素放在相同元素後面,所以這是一種穩定排序。

c**實現:

#include

#include

intmain()

;int n =

sizeof

(a)/

sizeof

(a[0])

;for

(i =

1; i < n; i++

)else

} a[j +1]

= temp;

}for

(i =

0; i < n; i++

)system

("pause");

return0;

}

**生成圖:

折半插入排序

原理:

折半插入排序(binary insertion sort)是對插入排序演算法的一種改進,所謂排序演算法過程,就是不斷的依次將元素插入前面已排好序的序列中。

思想:

基本思想和直接插入排序相同,不同在於查詢插入位置。

直接插入排序是採用順序查詢法,而折半插入排序排序是採用二分查詢思想。

**折半插入排序

演算法分析:

折半插入排序要比直接插入排序快,所以折半插入排序的平均效能要優於直接插入排序。

折半插入排序的關鍵碼比較次數和待排序序列的初始序列無關,僅依賴於物件的個數,在插入第i個物件時,需要經過次關鍵碼比較,才能確定它插入的位置。

當n比較大時,總關鍵碼的比較次數要比直接插入排序情況好的多,但要比最好的情況差。

在物件的初始排序已經按關鍵碼排好或接近有序時,直接插入排序比折半插入排序的關鍵碼的比較次數要少。

折半插入排序的物件的移動次數與直接插入排序相同,依賴於物件的初始序列,折半插入排序只是在資料較多的情況下減少了比較次數。

c**實現:

#include

#include

void

blninsertsort

(int a,

int len)

else

}for

(j = i -

1; j >= mid ;

--j)

a[j +1]

= temp;}}

intmain()

;blninsertsort

(a,10);

for(i =

0; i <

10; i++

)printf

("%d "

, a[i]);

system

("pause");

return0;

}

**生成圖:

排序演算法 插入排序(3種)

1.直接插入排序 思想 利用有序表的插入操作進行排序 有序表的插入 將乙個記錄插入到已排好序的有序表中,從而得到乙個新的有序表 特點 穩定 空間代價 o 1 時間代價 o n 2 1 void insertsort int array,intn 2 16 此時j後面就是記錄i的正確位置,回填 17 ...

排序 3 C 插入排序

插入排序的其中一種 直接插入排。時間複雜度為o n 2 空間複雜度為o 1 是一種穩定的排序方法。比如有資料 3,6,2,8,5 1.首先將資料3當成乙個有序陣列,然後將6插入有序陣列中,結果 2.然後將資料2插入有序陣列中,即 3.然後將資料8插入有序陣列中,即 4.然後將資料5插入有序陣列中,即...

基本排序之插入排序

關於排序,你最重要的一定要學會它的思想,也就是通過什麼方式排序?這裡就是乙個插入法,也就是無序的元素,依次插入有序的序列中,是和前面有很明顯的不同,前面都是相互交換,這裡是插進去,看到區別了嗎?插入排序也是很簡單的一種,看 吧,沒什麼好說的 includeusing namespace std te...