內部排序 C語言

2021-09-28 23:09:30 字數 4035 閱讀 1965

根據排序時資料所占用儲存器的不同,可將記憶體分為兩類。一類是整個排序過程完全在記憶體中進行,稱為內部排序;另一類是由於待排序記錄資料量太大,記憶體無法容納全部資料,排序需要借助外部儲存裝置才能完成,稱為外部排序

關鍵字可以是記錄的主關鍵字,也可以是次關鍵字,甚至可以是記錄中若干資料項的組合。若k是主關鍵字,則任何乙個無序的記錄序列經排序後得到的有序序列是唯一的;若k是次關鍵字或是記錄中若干資料項的組合,得到的排序結果可能是不唯一的,因為待排序記錄的序列中存在兩個或兩個以上關鍵字相等的記錄。

假設在待排序中存在多個具有相同關鍵字的記錄。設k(i)=k(j)( 1 <= i <= n , 1 <= j <= n,i != j ),若在排序前的序列中r(i)領先於r(j)(即i直接插入排序演算法的執行過程:

【演算法描述】直接插入排序

#include

#include

void

inssort

(int a,

int length)

a[j+1]

=num;}}

intmain()

inssort

(a,n)

;for

(i=0

;i)return0;

}

[演算法分析]直接插入排序演算法簡便,比較適用於待排序記錄數目較少且基本有序的情況。直接插入排序方法是穩定的排序方法。在直接插入排序演算法中,由於待插入元素的比較是從後向前進行的,迴圈 while(j>=0&&num【演算法描述】折半插入排序

#include

#include

void

binsort

(int a,

int length)

else

}for

(j=i-

1;j>=low;j--

) a[low]

=num;}}

intmain()

binsort

(a,n)

;for

(i=0

;i)return0;

}

[演算法分析]採用折半插人排序法,可減少關鍵字的比較次數。每插人乙個元素,需要比較的次數最大為折半判定樹的深度,如插人第i個元素時,設 i=2^j ,則需進行log(2)i次比較,因此插人n-1個元素的平均關鍵字的比較次數為nlog(2)n。當n較大時,折半插入排序法的比較次數比直接播人排序的最差情況要好很多,但比其最好情況要差。雖然折半插人排序法與直接插入排序法相比較,改善了演算法中比較次數的數量級,但其並未改變移動元素的時間耗費。

希爾排序演算法的執行過程:

【演算法描述】希爾排序

#include

void

shellsort

(int a,

int length)

a[j+delta]

=data;}}

}//for

}//shellsort

intmain()

shellsort

(a,n)

;for

(i=0

;i)return0;

}

氣泡排序演算法的執行過程:

快速排序演算法的執行過程:

【演算法描述】快速排序

#include

void

swap

(int*,

int*);

//函式宣告, 交換兩個變數的值

void

quicksort

(int*,

int,

int)

;//函式宣告, 快速排序

intmain

(void);

quicksort

(a,0,20

);printf

("最終排序結果為:\n");

for(i=

0; i<21;

++i)

printf

("\n");

return0;

}void

quicksort

(int

*a,int low,

int high)

while

(low < high)

//該while迴圈結束一次表示比較了一輪

if(low < high)

while

(low < high && key >= a[low])if

(low

} a[low]

=key;

quicksort

(a, i, low-1)

;//用同樣的方式對分出來的左邊的部分進行同上的做法

quicksort

(a, low+

1, j)

;//用同樣的方式對分出來的右邊的部分進行同上的做法

}

簡單選擇排序演算法的執行過程:

【演算法描述】簡單選擇排序

#include

void

selectsort

(int

*a,int length)

;int

main()

;//計算陣列的長度

int lengths=

sizeof

(array)

/sizeof

(array[0]

);//使用簡單排序演算法對陣列排序

selectsort

(array,lengths)

;for

(i=0

;i)return0;

}void

selectsort

(int

*a,int length)}if

(k!=i)

}}

歸併排序演算法的執行過程:

【演算法描述】歸併排序

c 內部排序演算法

include using namespace std 直接插入排序 為了實現n個數的排序,將後面n 1個數依次插入到前面已排好的子串行中,假定剛開始第1個數是乙個已排好序的子串行。經過n 1趟就能得到乙個有序序列。時間複雜度 最好情況o n 最壞情況o n 2 平均情況o n 2 空間複雜度 o ...

C 實現希爾排序 內部排序

希爾排序又稱 縮小增量排序 是直接插入排序演算法的一種更高效的改進版本,但它是非穩定的排序演算法,該方法因d.l.shell於1959年提出而得名。其基本思路也很簡單,我們設定乙個gap計算每次的縮小增量,每趟排序以gap進行分組,例如假設當前的gap為2的話,那麼他的分組就是array 0 arr...

內部排序 堆排序

堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 2 或者key i key 2i 1 key key 2i 2 即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。堆分為大頂堆和小頂堆,滿足key i key 2i 1 key ...