轉載自 這裡(Gossip@Caterpillar)
前言 :
快速排序法(quick sort)是目前所公認最快的排序方法之一(視解題的對象而定),雖然快速排序法在最差狀況下可以達O(n2),但是在多數的情況下,快速排序法的效率表現是相當不錯的.
快速排序法的基本精神是在數列中找出適當的軸心,然後將數列一分為二,分別對左邊與右邊數列進行排序,而影響快速排序法效率的正是軸心的選擇.
這邊所介紹的第一個快速排序法版本,是在多數的教科書上所提及的版本,因為它最容易理解,也最符合軸心分割與左右進行排序的概念,適合對初學者進行講解.
解法 :
這邊所介紹的快速演算如下:
將最左邊的數設定為軸,並記錄其值為 s
廻圈處理:
透過以下演算法,則軸左邊的值都會小於s,軸右邊的值都會大於s,如此再對軸左右兩邊進行遞迴,就可以對完成排序的目的,例如下面的實例,*表示要交換的數,[]表示軸:
在上面的例子中,41左邊的值都比它小,而右邊的值都比它大,如此左右再進行遞迴至排序完成.
演算法範例代碼 :
* SortQuick1.h 代碼 :
* SortQuick1.cpp 代碼 :
執行結果 :
前言 :
快速排序法(quick sort)是目前所公認最快的排序方法之一(視解題的對象而定),雖然快速排序法在最差狀況下可以達O(n2),但是在多數的情況下,快速排序法的效率表現是相當不錯的.
快速排序法的基本精神是在數列中找出適當的軸心,然後將數列一分為二,分別對左邊與右邊數列進行排序,而影響快速排序法效率的正是軸心的選擇.
這邊所介紹的第一個快速排序法版本,是在多數的教科書上所提及的版本,因為它最容易理解,也最符合軸心分割與左右進行排序的概念,適合對初學者進行講解.
解法 :
這邊所介紹的快速演算如下:
將最左邊的數設定為軸,並記錄其值為 s
廻圈處理:
透過以下演算法,則軸左邊的值都會小於s,軸右邊的值都會大於s,如此再對軸左右兩邊進行遞迴,就可以對完成排序的目的,例如下面的實例,*表示要交換的數,[]表示軸:
在上面的例子中,41左邊的值都比它小,而右邊的值都比它大,如此左右再進行遞迴至排序完成.
演算法範例代碼 :
* SortQuick1.h 代碼 :
- #include "main.h"
- #include "Basic.h"
- #define MAX_SORT_QUICK1_LEN 10
- /*
- * Source : http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/QuickSort1.htm
- */
- void quickSort(int num[], int len);
- void _quickSort(int num[], int left, int right, int len);
- #include "SortQuick1.h"
- void quickSort(int num[], int len) {
- _quickSort(num, 0, len-1, len);
- }
- void _quickSort(int num[], int left, int right, int len) {
- if(left < right) {
- int i = left;
- int j = right +1;
- while(1) {
- //向右找
- while(i+1< len && num[++i] < num[left]);
- //向左找
- while(j-1>-1 && num[--j] > num[left]);
- if(i>j)
- break;
- SWAP(num[i], num[j]);
- }
- SWAP(num[left], num[j]);
- _quickSort(num, left, j-1, len);
- _quickSort(num, j+1, right, len);
- }
- }
執行結果 :
This message was edited 6 times. Last update was at 24/05/2010 10:03:10
沒有留言:
張貼留言