日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

快速排序1

發布時間:2023/12/18 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速排序1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基本思想:

1. 從序列當中選擇一個基準數(pivot),我們選擇第一個數為基準數。 2. 先設置一個哨兵j,從右向左找到比基準數小的數 3. 再設置一個哨兵i,從左往右找到比基準數大的數(i不能大于j) 4. 如果i<j,則將兩個哨兵所在位置的數值交換 5. 當兩個哨兵相遇時,將哨兵i所在的數值與基準數(也就是第一個數)交換 6. 此時整個數組變成的三部分(比基準數小的左邊部分,中間部分的基準數,比基準數大的右邊部分) 7. 遞歸排列基準數左邊部分與基準數右邊部分

代碼

#include <stdio.h>void _quick_sort(int arr[],int l,int r){if(l>=r){return;}int p = arr[l];//設置基準數int i = l;int j = r;while (i!=j) {//順序很重要,從右向左找while (arr[j]>=p&&j>i) {j--;}//再從左往右找while (arr[i]<=p&&i<j) {i++;}//交換兩個數的位置if (i<j) {//當哨兵i和哨兵j沒有相遇時int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}arr[l] = arr[i];arr[i] = p;_quick_sort(arr, l, i-1);//繼續處理左邊的,這里是一個遞歸的過程_quick_sort(arr, i+1, r);//繼續處理右邊的,這里是一個遞歸的過程 }int quick_sort(int arr[],int n){_quick_sort(arr,0,n-1);return 0; }int main(int argc, const char * argv[]) {// insert code here...int arr[] = {9,2,1,6,5,4,3};quick_sort(arr, 7);for (int i = 0; i<7; i++) {printf("%d\n",arr[i]);}return 0; }

以下圖片及內容來源來之圖書啊哈!算法

類似下面這種排序

6 1 2 5 4 3 9 7 10 8

方法很簡單:分別從初始序列"6 1 2 7 9 3 4 5 10 8"兩端開始探測。先從右往左找一個小于6的數,再從左往右找一個大于6的數,然后交換他們。這里可以用兩個變量i和j,分別指向序列的最左邊和最右邊,我們為這兩個變量起一個好聽的名字,分別叫做"哨兵i"和"哨兵j"。

首先哨兵j開始出動。因為此處設置的基準數的最左邊的數,所以需要讓哨兵j先出動,這一點非常重要(請自己想一想為什么)。哨兵j一步一步往左挪動(即j--),直到找到一個小于6的數停下來。接下來哨兵i再一步一步向右挪動(即i++),直到找到一個大于6的數停下來。


現在交換哨兵i和哨兵j所指向的元素的值。

繼續移動


交換

相遇

與基準數交換

轉載于:https://www.cnblogs.com/zheng-chuang/p/6858591.html

總結

以上是生活随笔為你收集整理的快速排序1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。