直接插入排序
原理:
將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的、個數加一的有序資料,演算法適用於少量資料的排序。
思想:
將陣列的第乙個數認為是有序陣列,從前往後(或者從後往前)掃瞄該有序陣列,把陣列中其餘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...