重溫快速排序
說起排序,總是會想起大名鼎鼎的快速排序,等自己再次翻開快速排序時,感覺是很陌生的,從這個對比也能看出自己確實是已經忘記了曾經重要的日子。
快速排序使用了分治思想,分而治之。為了達到它傳說中較低的時間度,接受了來自大家多年的挑戰還依然是名副其實的快速排序。
一個簡單的例子就是透過簡單的例項來說明。
我們假設一組數字如下:
6,9,4,1,8,7,2,3,5
我們假設以第一個數為參考,即temp為6,兩邊的數的下標分別為i,j,從這組數的兩邊來比較這個中間變數,不斷的移動下標,從右邊開始尋找比temp小的數,從左邊開始和尋找比temp大的數。
在這個例子中就是以6為基本的參考,分別從這組數的右邊,左邊開始移動下標,尋找分別是小於6,大於6的節點。
需要經過這麼幾輪的比較。
第一輪,我們發現右邊第一個節點5<6,就是它了,從左邊開始,節點9>6,需要對這個兩個節點進行對調。
6,9,4,1,8,7,2,3,5
變為
6,5,4,1,8,7,2,3,9
繼續移動下標,從右邊開始尋找小於6的,從左邊開始尋找大於6的數,結果我們比較一番,發現數3<6,8>6
所以結果如下:
6,5,4,1,8,7,2,3,9
變為:
6,5,4,1,3,7,2,8,9
接下來繼續移動下標,發現,2<6,7>6得到的結果如下:
6,5,4,1,3,7,2,8,9
變為:
6,5,4,1,3,2,7,8,9
這個時候從右,從左下標都沒法再移動了,再移動就交叉了,這個時候就是需要對這組數進行劃分了,劃分的基本參考就是6
6,5,4,1,3,2,7,8,9
變為:
2,5,4,1,3,6,7,8,9
這個時候就分成了兩組數2,5,4,1,3 和7,8,9兩組數,然後根據分治思想需要對著兩組數進行進一步的比較。
右邊的3個數7,8,9已經是最後結果了,我們來看看左邊的數,2,5,4,1,3
設定temp=2,然後下標繼續從右,從左開始移動。
2,5,4,1,3
變為:
2,1,4,5,3
然後下標繼續移動就移動不了了。繼續拆分。
變為1,2, 4,5,3 繼續比較,拆分得到最後的結果。
透過程式的實現如下:
快速排序使用了分治思想,分而治之。為了達到它傳說中較低的時間度,接受了來自大家多年的挑戰還依然是名副其實的快速排序。
一個簡單的例子就是透過簡單的例項來說明。
我們假設一組數字如下:
6,9,4,1,8,7,2,3,5
我們假設以第一個數為參考,即temp為6,兩邊的數的下標分別為i,j,從這組數的兩邊來比較這個中間變數,不斷的移動下標,從右邊開始尋找比temp小的數,從左邊開始和尋找比temp大的數。
在這個例子中就是以6為基本的參考,分別從這組數的右邊,左邊開始移動下標,尋找分別是小於6,大於6的節點。
需要經過這麼幾輪的比較。
第一輪,我們發現右邊第一個節點5<6,就是它了,從左邊開始,節點9>6,需要對這個兩個節點進行對調。
6,9,4,1,8,7,2,3,5
變為
6,5,4,1,8,7,2,3,9
繼續移動下標,從右邊開始尋找小於6的,從左邊開始尋找大於6的數,結果我們比較一番,發現數3<6,8>6
所以結果如下:
6,5,4,1,8,7,2,3,9
變為:
6,5,4,1,3,7,2,8,9
接下來繼續移動下標,發現,2<6,7>6得到的結果如下:
6,5,4,1,3,7,2,8,9
變為:
6,5,4,1,3,2,7,8,9
這個時候從右,從左下標都沒法再移動了,再移動就交叉了,這個時候就是需要對這組數進行劃分了,劃分的基本參考就是6
6,5,4,1,3,2,7,8,9
變為:
2,5,4,1,3,6,7,8,9
這個時候就分成了兩組數2,5,4,1,3 和7,8,9兩組數,然後根據分治思想需要對著兩組數進行進一步的比較。
右邊的3個數7,8,9已經是最後結果了,我們來看看左邊的數,2,5,4,1,3
設定temp=2,然後下標繼續從右,從左開始移動。
2,5,4,1,3
變為:
2,1,4,5,3
然後下標繼續移動就移動不了了。繼續拆分。
變為1,2, 4,5,3 繼續比較,拆分得到最後的結果。
透過程式的實現如下:
點選(此處)摺疊或開啟
-
void quicksort(int left,int right)
-
{
-
int i,j,t,temp;
-
if(left>right)
-
return;
-
-
temp=a[left]; //temp中就是基準數,取第一個數
-
i=left;
-
j=right;
-
while(i!=j)
-
{
-
//順序很重要,要先從右邊開始找
-
while(a[j]>=temp && i<j)
-
j--;
-
//再找左邊的
-
while(a[i]<=temp && i<j)
-
i++;
-
//交換兩個數在陣列中的位置
-
if(i<j)
-
{
-
t=a[i];
-
a[i]=a[j];
-
a[j]=t;
-
}
-
}
-
//最後分拆,得到兩組數,對基準書進行重新初始化
-
a[left]=a[i];
-
a[i]=temp;
-
-
quicksort(left,i-1);//處理左邊的
-
quicksort(i+1,right);//處理右邊的
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1459116/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 希爾排序——重溫排序(二)排序
- 重溫經典排序思想--C語言常用排序全解 (轉)排序C語言
- 重溫TypescriptTypeScript
- 重溫redis命令Redis
- 排序之快速排序排序
- 重溫 Flex 佈局Flex
- 排序:氣泡排序&快速排序排序
- 快速排序排序
- 快速排序&&歸併排序排序
- 快速排序快速入門排序
- 騰訊遊戲“重溫舊夢”遊戲
- 重溫AngularJS(十三)-- 路由AngularJS路由
- 四、歸併排序 && 快速排序排序
- 選擇排序和快速排序排序
- 排序演算法__快速排序排序演算法
- 排序演算法:快速排序排序演算法
- 排序演算法-快速排序排序演算法
- 排序演算法——快速排序排序演算法
- 排序演算法 - 快速排序排序演算法
- 溫故而知新,重溫 Java 7 的那些“新”特性Java
- 快速排序法排序
- java 快速排序Java排序
- 快速排序javaScript排序JavaScript
- js 快速排序JS排序
- javascript 快速排序JavaScript排序
- 分治—快速排序排序
- QuickSort 快速排序UI排序
- 快速排序-java排序Java
- [JAVA]快速排序Java排序
- 快速排序 java排序Java
- 重溫物件導向核心上物件
- 【重溫基礎】20.事件事件
- 【重溫基礎】8.字串字串
- React 重溫之高階元件(HOC)React元件
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- 排序演算法之 '快速排序'排序演算法
- #排序演算法#【4】快速排序排序演算法
- 《排序演算法》——快速排序(Java)排序演算法Java