c++快速排序講解+演算法
首先說說快速排序,現在網上很多快速排序的解釋,我也談談我自己對快速排序的了解和看法。
快速排序是一種很高效的排序演算法,它的核心思想是:在要排序的陣列中,先選定乙個數(一般是第乙個數或者最後乙個數,就叫它x),以x為標準,進行一次排序,排序的結果是以x為中間值,比它大或小的值都在它的兩邊,然後再對兩邊部分繼續排序,直到排好。
舉例說明:
以陣列:s[12,2,4,56,64,8,12,32,79,9]為例進行公升序排序。
選定第乙個數12為初值,x=12;設定兩個陣列下標變數:組首i=0,組尾j=9;
從右往左找比x小或等於的數:即j=9,然後將9賦值給s[0],即s[0]=9;此時s[9]還是為9;
接下來從左往右開始找比x大的數:即從i=1處開始找,直到i=3時,將56賦值給剛剛的s[9],即s[9]=s[3];s[9]的值就為56;
再從j=8處從右往左找比x小或等於的數:找到s[6],執行s[3]=s[6],
再從i=3處從左往右開始找比x大的數:找到s[3],執行s[6]=s[3];
再從j=5處從右往左找比x小或等於的數:找到s[5],執行s[3]=s[5];
再從i=4處從左往右開始找比x大的數:找到s[4],執行s[5]=s[4];
這時x就處於整個陣列中間,把s[5]=x,第一趟排序就完成了。
畫個圖看看每趟排序後的結果:01
2345
6789
122456
6481232799
1924
5664812
327992
92456
6481232
795639
241264812
3279564
92412
6486432
795659
24128
8643279566
92412
8126432
7956
然後再對12前半部分和後半部分分別進行排序,就可以得到自己想要的結果了。下面附上**:
# include using namespace std;
void quicksortdown(int a, int, int);//函式宣告,按降序排序
void quicksortup(int a, int, int);//函式宣告,按公升序序排序
int main()
;//34, 65, 12, 43, 67, 5, 78, 10, 3, 70
int k;
int len = sizeof(array) / sizeof(int);
cout << "the orginal array are:" << endl;
for (k = 0; k < len; k++)
cout << array[k] << ",";
cout << endl;
quicksortdown(array, 0, len - 1);
cout << "the sorted array are" << endl;
for (k = 0; k < len; k++)
cout << array[k] << ",";
cout << endl;
quicksortup(array, 0, len - 1);
cout << "the sorted array are" << endl;
for (k = 0; k < len; k++)
cout << array[k] << ",";
cout << endl;
system("pause");
return 0;
}void quicksortdown(int s, int l, int r)//降序演算法
} s[i] = x;
quicksortdown(s, l, i - 1);
quicksortdown(s, i + 1, r); }}
void quicksortup(int s, int l, int r)//公升序演算法
while (i < j&&s[i] <= x)//從左向右找到第乙個大於等於x的數
i++;
if (i < j)
}s[i] = x;
quicksortup(s, l, i - 1); //遞迴呼叫本身
quicksortup(s, i + 1, r); //遞迴呼叫本身
}}
剛學習,粗陋見解,不對的地方歡迎指出。
我參考了這篇文章的**,感興趣的可以去看看
快速排序演算法的C 實現
但是當輸入有相同元素時,輸出就會有問題!該怎麼解決呢?或者更通用一點的 是什麼樣的呢?下次再編輯!隨機快速排序 include include include using namespace std void quicksort int arr,int num1,int num2 對陣列arr nu...
演算法 快速排序的c 實現
快速排序的思想 設定兩個左右哨兵,每次取最左邊的數作為基準數,然後先移動右哨兵,找出第乙個比基準數小的數 之後然後移動左哨兵,找到第乙個比基準數大的數,此時交換兩個哨兵指向的數,然後繼續移動重複上述過程,直到兩個哨兵重合,交換基準數與哨兵指向的數。再接著對基準數的左右兩邊分別重複上述過程 可用遞迴實...
快速排序演算法 c 實現
namespace backpackproblem backpack bp new backpack profit int start 0 int end profit.length 1 bp.quicksort profit,start,end bp.print class backpack 快速...