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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

快速排序图解(分治)--算法学习

發布時間:2023/12/31 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速排序图解(分治)--算法学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

思路

數組排序任務可以如下完成:
1)設k=a[0], 將k挪到適當位置,使得比k小的元素都
在k左邊,比k大的元素都在k右邊,和k相等的,不關心
在k左右出現均可 (O(n)時間完成)
2) 把k左邊的部分快速排序
3) 把k右邊的部分快速排序

圖解
一組數據:

7138121129

首先 左指針為i,右邊的指針為j,中間值為a[0]=7;
然后,左邊的讓著右邊的,右邊j向左移動,如下圖

發現2比7小停止移動了,所以2和7就進行調換

這時候右邊的調換一次了,總不能一直讓右邊移動,太累了,這時候左邊開始移動了,但是他發現1比7小就沒停,繼續移動

發現3比7還是小,就繼續移動,一直移動到8停下來了

8比7大,所以8和7進行了調換

這時候,右邊開始移動,發現11,12都比7大所以,沒有調換,最后ij都移動到了7的位置,他們倆相遇了,就停止了

對左右兩邊進行遞歸,就會得到有序的數組了

代碼:

#include <iostream> using namespace std; void swap(int& a, int& b) //交換變量a,b值 { int tmp = a; a = b; b = tmp; } void QuickSort(int a[], int s, int e) {if (s >= e)//相當于左指針跑到右指針右邊了,必然就停止了return;int k = a[s];//以a[s],即左邊第一個數為中間值int i = s, j = e;while (i != j) {while (j > i&& a[j] > k)//找不到比中間值小的就一直走--j;swap(a[i], a[j]);//找到了,進行交換while (i < j && a[i] <= k)//找不到比中間值大的就一直走++i;swap(a[i], a[j]);//找到了,交換}//處理完后,a[i]=k;QuickSort(a, s, i - 1);//對左右兩邊遞歸,得到QuickSort(a, i + 1, e); } int a[] = { 93,27,30,2,8,12,2,8,30,89 }; int main() {int size = sizeof(a) / sizeof(int);QuickSort(a, 0, size - 1);for (int i = 0; i < size; ++i)cout << a[i] << ",";cout << endl;return 0; } }

總結

以上是生活随笔為你收集整理的快速排序图解(分治)--算法学习的全部內容,希望文章能夠幫你解決所遇到的問題。

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