69,335
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
void Quick_sort(int *a,int left,int right);
int main(void)
{
int a[MAX],i;
for(i=0;i<MAX;i++)
scanf("%d",&a[i]);
Quick_sort(a,0,MAX-1);
printf("快速排序之后如下所示:\n");
for(i=0;i<MAX;i++)
printf("%d ",a[i]);
printf("\n");
system("pause");
return 0;
}
void Quick_sort(int *a,int left,int right)
{
int i,j,val;
val=a[left];
i=left;
j=right;
//分治法使得中间值左右两边分别所有小于和所有大于中间值
while(i!=j)
{
while(i<j&&a[j]>=val)
j--;
a[i++]=a[j];
while(i<j&&a[i]<=val)
i++;
a[j--]=a[i];
}
//i==j时,将中间量重新放置在a+i的位置
a[i]=val;
//递归左边
Quick_sort(a,left,i-1);
//递归右边
Quick_sort(a,i+1,right);
}
#include <stdio.h>
#define MAX 5
void Quick_sort(int *a,int left,int right);
int partition(int a[], int left, int right);
void qsort(int a[], int left, int right);
int main(void)
{
int a[MAX];
int i;
int len = MAX;
for(i = 0; i < len; ++i) {
scanf("%d", &a[i]);
}
printf("快速排序之前如下所示:\n");
for(i = 0; i < len; ++i) {
printf("%d ", a[i]);
}
printf("\n");
//Quick_sort(a, 0, len-1);
qsort(a, 0, len -1);
printf("快速排序之后如下所示:\n");
for(i = 0; i < len; ++i) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
void Quick_sort(int *a, int left, int right)
{
int i,j,val;
if(left < right) {
val = a[left];
i = left;
j = right;
//分治法使得中间值左右两边分别所有小于和所有大于中间值
while(i < j) {
while(i < j && a[j] >= val) --j;
if(i < j) a[i++] = a[j];
while(i < j && a[i] < val) ++i;
if(i < j) a[j--] = a[i];
}
//i==j时,将中间量重新放置在a+i的位置
a[i]=val;
//递归左边
Quick_sort(a, left, i - 1);
//递归右边
Quick_sort(a, i + 1, right);
}
}
int partition(int a[], int left, int right) {
int i;
int j;
int val;
i = left;
j = right;
val = a[left];
while(i < j) {
while(i < j && a[j] >= val) --j;
if(i < j) a[i++] = a[j];
while(i < j && a[i] < val) ++i;
if(i < j) a[j--] = a[i];
}
a[i] = val;
return i;
}
void qsort(int a[], int left, int right) {
if(left < right) {
int pivot = partition(a, left, right);
qsort(a, left, pivot - 1);
qsort(a, pivot + 1, right);
}
}
更多实现参见:
http://blog.csdn.net/wzb56/article/details/7349083while(i<j)//判断改成这样,不然的话可能会死循环哦,如果数据是1,2....10的话,用你的会变成i>j哦,不会有i == j的情况
{
while(i<j&&a[j]>=val)
j--;
if(a[j]<val)//如果a[j]<val才把a[j]放到前面去,不然就没必要了
a[i++]=a[j];
while(i<j&&a[i]<=val)
i++;
if(a[i] > val)//如果a[i]val时,才把a[i]放到后面去,不然也没必要了
a[j--]=a[i];
}
while(i<j)//判断改成这样,不然的话可能会死循环哦
{
while(i<j&&a[j]>=val)
j--;
if(a[j]<val)//只有在这情况下才交换
a[i++]=a[j];
while(i<j&&a[i]<=val)
i++;
if(a[i] > val)//只有在这情况下才交换
a[j--]=a[i];
}
里面交换值得时候,不是 while(i<j&&a[j]>=val)已经执行完毕,找到需要的值,下面交换时if判断个人觉得多余啊,因为判断条件就是找出小于中间值的那个元素
void qsort_one_fun(int a[], int begin, int end)
{
if (begin<end)
{
int b=begin;
int e=end;
int temp=a[b];
while(b<e)
{
while (b<e && a[e]>=temp)
{
e--;
}
a[b]=a[e];
while (b<e && a[b]<=temp)
{
b++;
}
a[e]=a[b];
}
a[b]=temp;
qsort_one_fun(a, begin, e-1);
qsort_one_fun(a, e+1, end);
}
return;
}