直接插入排序

冰山一角_發表於2021-01-03

直接插入排序的思想是:
①將整個待排序的記錄序列劃分為有序區和無序區,初始時有序區為待排序記錄中的第一個記錄,無序區包括所有剩餘的其他記錄;
②將無序區的第一個記錄插入到有序區的合適位置中,從而使無序區減少一個記錄,有序區增加一個記錄;
③重複執行②,直到無序區中沒有記錄為止。
具體程式碼如下:

void InsertSort(int array[],int n )
{  int i , j ,temp;
	for(i = 1;i<n;i++)//執行的趟數:n-1次
	{ 
	temp=array[i];
	for(j=i-1;j>=0&&temp<array[j];j--)
	array[j+1]=array[j];//注意,上面的for沒有花括號哦
	array[j+1]=temp;
	}
}
//更簡單點來說就是:不斷的擴充套件有序區域的範圍,比如說是[12,15] ,09,20,06
//這樣的一組數,[] 裡的數是已經排序好的,現在擴充套件有序區域的範圍,於是變成了
//[12,15,9],20,06 但是呢,有序區雖然擴充套件了,但是得將新增加進來的數進行位置調整
//首先temp=這個數,然後如果temp<原先有序區的最後一個數,也就是15,就交換他們 
//變成了 [12,15,15],20,06 然後j-- 
//j指向了12,然後9還是小於12 然後變成了[12,12,15],20,06 
//最後再j--不滿足迴圈了,退出來,此時j是等於-1的,然後j+1就是0了
//也就是剛才12的位置,再用9替換掉。
//假如不是9呢?是13呢?,那麼序列最終會變成[12,13,15],20,06
//也就是說,迴圈的操作就是相當於給從無序區增加到有序區的那個特定的數值“留空”
//假如是16呢?那麼會發現,迴圈for 根本不執行
//然後執行 temp=array[i];和array[j+1]=temp; 發現:j=i-1;然後for 不執行,j還是等於i-1。
//然後 array[j+1]=temp; 就是array[i-1+1]=temp;也就是說,自己等於自己~
//(理解的朋友可能會覺得我說得是廢話哈= = ,但還是要說一下…)

感謝每位閱讀的人!

相關文章