快速排序法!!

来源:互联网 发布:hr人力资源软件 编辑:程序博客网 时间:2024/05/17 23:29

#include<iostream>using namespace std;int AdjustArray(int s[], int L, int R){    int i=L, j=R, x=s[i]; while(i<j) //i一直都在左边,一直都是小于j的。直到最终i==j 位置 跳出循环。{// from right to leftwhile(i<j && s[j]>=x){j--; //从右往左,当s[j]>x时,那么那个位置就不用管,往右减一个位置,直到s[j]<x。}if (i<j && s[j]<x) {s[i]=s[j]; //随后将右边s[j]给填到左边第一个s[i]中,继续往右边走。 i++i++; }// from left to rightwhile(i<j && s[i]<x)  {i++; //从左往右,如果s[i]<x 就往右走。 直到s[i]>x}if(i<j && s[i]>x){s[j]=s[i];j--;//当s[i]>x时,就把s[i]这个数填入到前面s[j]出坑的那个位置。 然后出坑的时候的位置继续往左走。}}s[i]=x; //循环跳出来 最终s[i]==x 就是i位于了 数组的中间位置。return i; //返回这个中间位置。}//这点有点难理解 因为是连续函数本身自己调用,而且下面调用了两次。结束表示就是i 在不断变化,最后和L和R已经相等,没有无法进行排序。 这是我的想法,因为同时左右空间都在循环,解析来左右空间下面的子空间(左右)也在循环,很复杂所以,只能这样子想 明天看看继续缩减到一个函数内。!void quicksort1(int s[], int L, int R){if (L<R){int i=AdjustArray(s,L,R);quicksort1(s,L,i-1);quicksort1(s,i+1,R);}}int main(){int s[]={1,2,3,4,5,6,89,454,5,1, 4, 3, 4, 6, 1, 35,  8, 4};int L =0, R=17;quicksort1(s, L, R);for (int i =0; i<18; i++){cout<<s[i]<<endl;}return 0;}


这样看着比较麻烦 把这个函数放在一个函数里面:

#include<iostream>using namespace std;void quicksort1(int s[], int L, int R){int i=L, j=R, x=s[i]; while(i<j){// from right to leftwhile(i<j && s[j]>=x){j--;}if (i<j && s[j]<x){s[i]=s[j];i++; }// from left to rightwhile(i<j && s[i]<x){i++;}if(i<j && s[i]>x){s[j]=s[i];j--;}}s[i]=x;if (L<R){quicksort1(s,L,i-1); //递归在左半部分排序。quicksort1(s,i+1,R); //递归在右半部分排序。 最终断开的条件是左半部分已经L==R饱和排完序了,右半部分也饱和排完序。 }}int main(){int s[]={1,2,3,4,5,6,89,454,5,1, 4, 3, 4, 6, 1, 35,  8, 4};int L =0, R=17;quicksort1(s, L, R);for (int i =0; i<18; i++){cout<<s[i]<<endl;}return 0;}

快速排序怎么画 书上有 我已经花了好多次了:

快速排序其实是冒泡排序的一个高级算法。

快速排序的时间复杂度是O(nlogn) 最坏的情况就是冒泡排序O(n^2)

快速排序的空间复杂度是(log2N);


0 0
原创粉丝点击