所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法。排序演算法在很多領域得到相當地重視,尤其是在大量資料的處理方面。乙個優秀的演算法可以節省大量的資源。在各個領域中考慮到資料的各種限制和規範,要得到乙個符合實際的優秀演算法,得經過大量的推理和分析。排序步驟
從陣列的第乙個數arr[0]
開始遍歷,(i從0到n-1)如果第i個數比第i+1個數大arr[i]>arr[i+1]
,則交換
重複上述步驟直至陣列有序 分析
氣泡排序可以說是最簡單的排序方法之一,最壞的情況需要排n-1趟。我們可以設定乙個flag
來監測排序過程中是否產生的數的交換,如果沒有,說明陣列已經有序,則可以不用進行下一趟排序。
c語言實現
void
bubble_sort
(int arr,
int n)if(
!flag)
return;}
}
排序步驟
在當前區域(記為area)(area初始為整個無序陣列)選定乙個數作為基準數(記為key)
遍歷陣列,把所有大於key的數(記為high)放在右邊,把所有小於key的數(記為low)放在左邊(並不關心這些數是否有序)
把key放在low和high的中間
現在area又被分為三個區域,lowkeyhigh,分別選擇low和high作為新的area,分別重複上述流程
原理分析
每次我們在當前area中把所有數以key為中間數擺放好,實質上就是在整個陣列中確定好了key這個數最終的位置,左邊的數都比key小,右邊的數都比key大。不斷重複這個過程那麼最終所有數都必將擺在最終的位置
手動排序示例
下面是乙個無序陣列:
8 ,5, 2, 3,-1 , 7當前area為[0] ~ [5] (陣列編號)我們選擇中間的乙個數2作為本輪的key
從兩端開始找:
7比key大,沒毛病
-1比key小,扔到最左邊,現在陣列:
-1,5, 2, 3,8,7移動過的數和比過大小沒移動的數都是已處理的數(我用粗體標記了),待在了自己該待在的區域,因此我們不需要對這些數再進行操作,也不應該用其他的數來填充他們的位置,因為我們不關心他們之間是否有序,只關心他們和key的位置關係是否正確
然後我們從左邊開始找,(如果繼續從右邊找會重複工作,不信你可以動手試一下)
-1是剛剛丟過來的,不用管
5比key大,移動到未處理的最右邊:
-1,3,2,5,8,7我們並沒有檢查交換過來的數和key的關係,因此交換過來的數是未處理的數
繼續,2等於key,移到左邊:(等號的情況必須得移動,不然key的位置就被固定了!但比key小的數在key左邊不一定放的下)
-1,2,3,5,8,7最後3的位置是在2右邊的,不需要動,第一趟完成,現在[0]是low,[2]~[5]是high
因為low只有乙個數,不需要繼續處理
現在high是新的area:
3,5,8 ,7為了展示key的選取不影響排序結果(雖然影響排序效率),我們選擇第乙個數3作為key
那麼跑完整個流程,所有的數都大於等於3,這次就沒有low區域了
選擇新的high作為area:
5, 8, 7這次又隨機選,選最後乙個數7(讀者可以自行嘗試選取其他的key進行排序)
7不動,8比key大
5, 7, 8到這顯而易見已經完成了
c語言實現
void
quick_sort
(int arr,
int l,
int r)
arr[i]
=key;
quick_sort
(arr,l,i-1)
;quick_sort
(arr,i+
1,r)
;}
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...