#include<iostream>
using namespace std;
#define SWAP(x,y) {int t; t = x; x = y; y = t;}
int paitition(int *a,int p,int r)
{
int i = p-1;
for(int j = p; j < r-1; ++j)
{
if(a[j] <= a[r])
{
++i;
SWAP(a[i],a[j]);
}
}
SWAP(a[++i],a[r]);
return i;
}
void quick_sort(int *a,int p,int r)
{
int q = 0;
if(p < r)
{
q = paitition(a,p,r);
quick_sort(a,p,q-1);
quick_sort(a,q+1,r);
}
}
int main()
{
int a[] = {1,3,10,2,5};
quick_sort(a,0,4);
for(int i = 0; i < 5; ++i)
cout << a[i]<< " ";
}
谁解释下啊?
paitition函数有问题,a[i]应该代表当前元素,但这里显然不是。
quicksort的paitition函数代码应该如下:
int paitition(int *a,int p,int r)
{
int pivotkey=a[p];
while(p<r)
{
while(p<r && a[r]>=pivotkey)
--r;
a[p]=a[r];
while(p<r && a[p]<=pivotkey)
++p;
a[r]=a[p];
}
a[p]=pivotkey;
return p;
}
这个是从小到大排序的。从大到小类似。
#define SWAP(x,y) {int t; t = x; x = y; y = t;}
该函数对数组没有影响
比如说: a[0]=1, a[1] = 2;
swap(a[0], a[1]) 之后,还是
a[0] = 1, a[1] = 2;
java版:
private int Partition(int[] array,int i,int j)
{
int pivot =array[i];
while(i <j)
{
while(i <j&&array[j]> =pivot)
j--;
if(i <j)
array[i++]=array[j];
while(i <j &&array[i] <=pivot)
i++;
if(i <j)
array[j--]=array[i];
}
array[i]=pivot;
return i;
}