#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 left
while(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 right
while(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 left
while(i<j && s[j]>=x)
{
j--;
}
if (i<j && s[j]<x)
{
s[i]=s[j];
i++;
}
// from left to right
while(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);