排序 直接插入排序

2021-09-10 14:18:02 字數 1906 閱讀 7582

直接插入排序

定義直接插入排序是一種最簡單的排序方式,因此也被稱為簡單插入排序

基本思想:第i趟排序將序列中的第i+1個元素ki+1插入到乙個已經按有序的子串行(k1,k2,···,ki)中的合適的位置,使得插入後的序列仍然保持按值有序

有這樣乙個資料元素序列,其中6』表示該元素與本序列中的其他元素有重複,在此加以區分。

①首先該序列中已存在乙個有序的子串行。

{(3,6),4,2,11,10,6』}

②接下來要將4插入到這個子串行中,得到乙個含有3個元素的有序的子串行。首先應當判斷4應當插入的位置,然後才能進行插入。具體方法是,從元素6開始向左查詢。因為4小於6,因此應當將元素6向後移動因為元素4大於元素3,因此將4插入到3和6之間。這樣在原序列中得到乙個按值有序的子串行。

上述這個插入過程成為一趟直接插入排序。

按照這種插入的方法,可將後續4個元素逐一插入到前面的子串行中,形成新的子串行。當子串行與原序列長度一樣時,插入排序結束。

在進行第1趟的插入排序時,可將第1個元素看成長度1,按值有序的子串行,然後將第2個元素插入到這個子串行中。以此類推,第i趟排序將序列中的第i+1個元素ki+1插入到乙個已經按值有序的子串行(k1,k2,···,ki)中的合適的位置,使得插入後的序列仍然保持按值有序。

上述元素序列的直接插入排序過程如下圖所示:

開始狀態:

↓第1趟排序:  

↓第2趟排序:

↓第3趟排序:

↓第4趟排序:

↓第5趟排序:

↓第6趟排序:

從這個插入排序的過程中可以看出:乙個包含有n個元素的序列,需要n-1趟的直接插入排序就可以將原序列排列有序。直接插入排序的演算法描述如下:

void sort(keytype k,int n)

}

通過上面的演算法可以看出,將元素k[i]=tmp插入到子串行k[1]~k[i-1]中時要進行一系列的比較,將比k[i]大的元素向後移動,直到找到比k[i]小的第乙個元素為止,將k[i]=tmp插入到這個元素的前面。因此本演算法的功能是將序列從小到大遞增排列。也可模仿該演算法設計出從大到小的排列演算法。

在本演算法中,資料序列用乙個keytype型別的陣列k存放,第乙個元素k[0]沒有使用。因此在演算法中可以省卻掉臨時變數tmp,用k[0]儲存每次待插入的元素k[i],這樣就節省了系統的空間開銷。因為keytype型別的大小是不一定的。

【例項】

編寫乙個c程式,實現資料序列的直接插入排序,要求從大到小,並輸出排序後的數列元素。

【分析】

該資料序列包含10個元素,因此可以將它放到乙個含有11個單元的陣列中,第0號元素作為存放每次待插入的元素k[i]的空間,在這裡不能直接照搬前面給出的演算法,要將前面實現從小到大排列的演算法加以修改,從而達到從大到小排列的目的。

#includesort(int a,int n)//直接插入排序 

}main()

; //初始化序列,a[0]可任意賦值

printf("原序列為:\n");

for(i=1;i<=10;i++)//顯示原序列中的元素

printf("%d ",a[i]);

sort(a,10);//插入排序

printf("\n排序後的序列為:\n");

for(i=1;i<=10;i++)//輸出排序後的結果

printf("%d ",a[i]);

return 0;

}

插入排序 直接插入排序

直接插入排序演算法思想 將整個資料表分成左右兩個子表,其中左子表為有序表,右子表為無序表 整個排序過程就是將右子表中的元素逐個插入到左子表中,直到右子表為空,而左子表成為新的有序表。演算法過程分析 將待排序的元素存放在陣列r n 1 中,在初始狀態下,r 0 為監視哨,r 1 為有序區,r 2 r ...

插入排序 直接插入排序

一.插入排序的基本思想 將乙個記錄插入已排序好的有序表中,從而得到乙個新的記錄數加1的有序表。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。所謂的哨兵,就是即將插入的記錄。二.示例 如果碰見相等的元素,會被插到後面,所以,相等元素的前後順序沒有改變,插入排序是穩定的。三.演算法實現 public ...

插入排序 直接插入排序

直接插入排序的基本思想 將乙個記錄插入到已排序好的有序表中,然後得到乙個新記錄數增1的有序表。也就是 先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。如果碰見乙個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒...