(一)演算法基礎 排序演算法

2021-10-08 02:26:34 字數 2111 閱讀 4218

作為演算法的入門,排序演算法再合適不過了,在這裡我主要介紹四種排序演算法——插入排序、歸併排序、快速排序以及希爾排序。不過在介紹這些演算法之前,我們先來做一些準備工作。

(一)演算法測試函式

在實現乙個演算法後,必然要對這個演算法進行除錯和分析,這裡我寫了一些函式用於演算法的測試。

隨機數組生成函式

int

*generaterandomarray

(int n,

int rangel,

int ranger)

陣列列印函式

void

printarray

(int

* arr,

int n)

陣列有序判斷函式

bool

issorted

(int

* arr,

int n)

測試演算法函式

void

testsort

(string sortname,

void

(*sort)

(t,int n)

, t arr,

int n)

陣列複製函式

int

*copyintarray

(int a,

int n)

近似有序陣列生成函式

int

*generatenearlyorderarray

(int n,

int swaptimes)

return arr;

}

(二)排序演算法介紹插入排序

歸併排序

快速排序

希爾排序

插入排序

所謂插入排序,就是選定乙個基準,然後從前向後或是從後向前不斷插入。我們舉乙個例子,陣列arr=。

arr陣列中0-0範圍內的數已經排好序了,我們繼續看0-1的範圍。1 6也已經排好序了,繼續看0-2的範圍。這時發現,1 6 5順序沒有排好,那麼我們來進行插入。5<6,所以5和6進行交換,5>1所以停止,繼續看0-4的範圍。顯然,1 5 6 2沒有排好序,2<6,所以2和6交換;2<5,所以2和5交換;2>1所以停止,以此類推。

int

insertionsort

(int

* arr,

int n)

arr[j]

= temp;

}}

雖然插入排序比較簡單,但是這是希爾排序的基礎。

歸併排序

歸併排序採用的是分而治之的思想。這裡我們不過多的用語言去解釋,直接用例子。

void

merge

(int arr,

int left,

int mid,

int right)

else

if(j > right)

else

if(aux[i - left]

< aux[j - left]

)else}}

void

mergesort

(t arr,

int left,

int right)

else

if(arr[mid]

> arr[mid +1]

)merge

(arr, left, mid, right)

;}

快速排序

void

quick_sort

(int q,

int l,

int r)

quick_sort

(q, l, j)

,quick_sort

(q, j +

1, r)

;}

演算法導論 一 演算法基礎

迴圈不變式主要用來幫助我們理解程式的正確性。迴圈不變式的三條性質 初始化 迴圈的第一次迭代之前,它為真。保持 如果迴圈的某次迭代之前它為真,那麼下次迭代之前它仍為真。終止 再迴圈終止時,可驗證演算法的正確性。偽 的重要性在於它可以簡潔地表達出演算法的本質 縮排代表塊結構 採用縮排代表塊結構可以大大提...

基礎演算法之一 演算法概論

常見的基礎演算法有 分治 動態規劃 貪心 回溯與分支限界等,常用的技巧方法有 遞迴,遞推,空間時間互換,快取,重疊子問題,記憶化。演算法的本質是 狀態,狀態的轉移,問題的定義,以及子問題的定義。分治演算法思想 分而治之,大事化小小事化了。一句話 化繁為簡。例子 快排。動態規劃思想 由前乙個或者幾個狀...

每日一演算法 》氣泡排序

氣泡排序定義 它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端,故名。氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比...