它是將乙個已經有序的資料序列,在這個已經排好的資料序列中插入乙個數,但要求插入後此資料序列仍然有序一種新的排序方法。插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的、個數加一的有序資料,演算法適用於少量資料的排序。它的過程是:把要排序的陣列分成兩部分:第一部分包含了這個陣列的所有元素,但將最後乙個元素除外,而第二部分就只包含這乙個元素。在第一部分排序後,再把這個最後元素插入到此刻已是有序的第一部分裡的位置。
插入排序包括:直接插入排序,二分插入排序(又稱折半插入排序),鍊錶插入排序,希爾排序(又稱縮小增量排序)。
為了方便描述,使用順序表型別定義如下:
#define maxsize 1000直接插入排序:typedef int keytype;
typedef struct rectype;
typedef struct sqlist;
設r[1...n]為待排序的n個記錄,r[1...i-1]已按照關鍵字從小到大排序。
void dinsert (sqlist & q){ int i,j,k;
rectype t;
for(i=1;i=0&&t.key希爾排序:
希爾排序(shell sort)是插入排序的一種。是針對直接插入排序演算法的改進。該方法又稱縮小增量排序,因dl.shell於2023年提出而得名。
希爾排序基本思想:
先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為d1的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序;然後,取第二個增量d2該方法實質上是一種分組插入方法。
給定例項的shell排序的排序過程 :
初次取線性表的一半長度為步長,以後每次減半,直到步長為1,演算法如下:
void shsort(sqlist &q)
{ int j,k,h;
rectype y;
for(h=q.length/2;h>0;h/=2)
for(j=1;j<=h;j++)
{y=q.r[j];
for(k=j-h;k>=0&&y.key好了,就先說到這裡了。
出處:
優秀演算法系列
插入排序 它是將乙個已經有序的資料序列,在這個已經排好的資料序列中插入乙個數,但要求插入後此資料序列仍然有序一種新的排序方法。插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料,演算法適用於少量資料的排序。它的過程是 把要排序的陣列分成兩部分 第一部分...
排序演算法系列
概述 概念 排序是計算機內經常進行的一種操作,其目的是將一組 無序 的記錄序列調整為 有序 的記錄序列。排序分為內部排序和外部排序。若整個排序過程不需要訪問外存便能完成,則稱此類排序問題為內部排序。反之,若參加排序的記錄數量很大,整個序列的排序過程不可能在記憶體中完成,則稱此類排序問題為外部排序。排...
演算法系列 二
長時間沒接著寫了,今天接著未完成的革命,接下來就是快速排序 快速排序的思想就是先選取乙個基準點,然後將小於基準點的放在基準點的左邊,大於基準點的數放在基準點右邊,然後將左 右邊的陣列再重複上述步驟直到全部排序完成。還是如陣列 20 40 50 10 60 left指標指向20,right指標指向60...