69,373
社区成员
发帖
与我相关
我的任务
分享
template <class T>
void qsort(T* a, int left, int right)
{
if(a == NULL || left <0 || right<0)return;
if(left >= right)return;
/*last为当前key值得位置,key为a[left]*/
int last = left;
for(int i=left+1;i<=right;i++)
{
/*遍历数组,将小于key放到一边,将大于key的放到另一边,并记录key的最后位置*/
if(a[i]<a[left])
swap<T>(a[i],a[++last]);
}
/*
设x表示小于key的值, y表示大于key的值
则当前数组变成 key x x x x x y y y y y y
last此时值为最后一个x的位置。
*/
swap<T>(a[left], a[last]);
/*
交换key和a[last]数组变成 x x x x x key y y y y y y
*/
/* 分治处理 x x x x x 和 y y y y y y */
qsort<T>(a, left, last-1);
qsort<T>(a,last+1, right);
}
swap<T>(a[left], a[last]);
qsort<T>(a, left, last-1);
qsort<T>(a,last+1, right);
这里的last是指遍历之后key的位置,左边为<key , 右边为>key #include<stdlib.h>
#include<stdio.h>
int a[100]={0},n;
int quicksort(int left,int right)
{
int i,j,temp,t;
if(left > right)
return 0;
temp = a[left];//存储基准数
i = left;
j = right;
while(i != j)
{
//必须先从右边开始查找,否则基准数交换的会是一个大于基准数的值
while(a[j] >= temp && i < j)
j--;
while(a[i] <= temp && i < j)
i++;
if(i < j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[left] = a[i];
a[i] = temp;
quicksort(left,i-1);
quicksort(i+1,right);
}
int main()
{
int i,j,k;
printf("请输入数据长度:\n");
scanf("%d\n",&n);
for(i = 0;i < n;i++)
scanf("%d",&a[i]);
quicksort(0,n-1);
for(i = 0;i < n;i++)
printf("%d ",a[i]);
printf("\n");
system("pause");
return 0;
}
template<class T>
void swap(T& a, T &b)
{
T temp = a;
a = b;
b = temp;
}
template <class T>
void qsort(T* a, int left, int right)
{
if(a == NULL || left <0 || right<0)return;
if(left >= right)return;
int last = left;
for(int i=left+1;i<=right;i++)
{
if(a[i]<a[left])
swap<T>(a[i],a[++last]);
}
swap<T>(a[left], a[last]);
qsort<T>(a, left, last-1);
qsort<T>(a,last+1, right);
}