好久沒寫部落格,最近看到乙個比較冒泡、選擇和快速排序演算法效率的**段,突然想自己寫下快速排序,才發現,快速排序**還不是一下子能寫出來的,花了點時間才算完成,故權當記錄方便後續檢視吧。
一、快速排序原理:快速排序首先是記錄一組資料的第乙個位置稱為低位和最後乙個位置稱為高位,然後選取一組基礎資料中的某乙個位置資料做為基準資料(通常是最左邊第乙個資料),然後從該位置開始的右邊的最後乙個位置開始由後往前找到第乙個小於該基準資料的數,進行交換,並記錄該位置,接著從基礎資料的第乙個位置到記錄的位置,從前到後找到第乙個大於基準資料的數字,交換,然後把基準資料還原,只要低位小於高位,則不斷進行上述迴圈操作,最後資料被分成三部分,小於基準資料的部分、基準資料和大於基準資料部分,最後對小於基準資料部分和大於基準資料部分再次進行上述遞迴比較,最後得出的資料就是有序的。
二。快速排序說明
定義一組資料, 10,25,15,6,17
① 以10為基準資料 ,先將10存在乙個變數中, 從高位位置5往前比較找到大於10的數字並交換,此時資料序列為 6,25,15,6,17,高位置變為4
②從低位位置1開始從前往後比較,找到大於10的數,並交換資料,資料序列此時改為6,25,15,25,17,此時低位置為2
③繼續①步驟找不到小於10的數,高位置等於2,進行②步驟比較交換資料,資料序列變為6,25,15,25,17,低高位位置相同都為2,即基準點的新位置
④還原基準資料,此時資料序列變為6,10,15,25,17
⑤ 此時基礎資料分成了三部分,基準資料、比基準資料小的區域及比基準資料大的區域,然後對除基準資料之外兩區域繼續執行上述①②③④操作,
最後資料全部變成有序序列6,10,15,17,25。
三、**實現
由於目前對pascal語言比較熟,故暫提供pascal版實現,開啟delphi開發工具,新建乙個控制台應用程式,**實現如下:
program quicksort;
uses
sysutils;
procedure showarray(ar:array of integer);
vari:integer;
begin
for i:=low(ar) to high(ar) do
write(ar[i],' ');
end;
procedure quicksortarr(var arrs:array of integer;left,right:integer);
vari,j,temp:integer;
begin
if left>=right then exit; //左邊比右邊大或者相等則退出
i:=left;
j:=right;
temp:=arrs[i]; //選擇最左邊做為基準數
while i=temp) do
inc(j,-1); //從後面往前找第乙個小於基準數的數字位置,給當前最左值
arrs[i]:=arrs[j];
while (i
執行效果如下:
寫到這裡基本算是又複習了一遍,演算法原理本身不複雜,簡單來說就是分區域然後遞迴呼叫,但實際寫還是不能一步到位,程式設計還是在於多思考和實踐,也希望程式設計大神們能多多指教。
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...
演算法 排序演算法 快速排序
快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...
演算法設計 快速排序 隨機快速排序演算法
1.演算法流程 快速排序的時間複雜性分析 1.最壞情況劃分 當劃分產生的兩個子問題分別包含了n 1個元素和0個元素時,快速排序是最壞情況,假如每次遞迴呼叫,總是出現最不平衡劃分,這是最不平衡劃分。劃分操作時間複雜度為 n 則演算法執行時間的遞迴表示式為t n t n 1 t 0 n 利用代入法可以求...