69,373
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
//快速排序思路:
//1 将首元素作为基准元素,首元素位置留空
//2 从右边找比基准元素小的数,放到左边,右边一个空位
//3 从左边找比基准元素大的数,放到右边
//4 重复执行 2、3步,直到左边索引>=右边索引
//5 将基准元素放在当前左索引位置(差不多中间的位置)
#define LEN 8
int a[LEN] = { 5, 2, 4, 7, 1, 3, 2, 6 };
int Partition(int a[],int p,int r);
void Swap(int a,int b);
void QuickSort(int a[],int p,int r)
{
if(p<r)
{
int q=Partition(a,p,r);//q是当前划分点
printf("当前Q的值是:%d\n",a[q]);
for(int i=0;i<LEN;i++)
{
printf("%d,",a[i]);
}
printf("\n");
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
int Partition(int a[],int p,int r)
{
printf("当前P的值是:%d\n",a[p]);
int i=p,j=r+1;//i指向了数组的第一个数,j指向了数组的最后一个数
int x=a[p];//x现在的值是数组a的第一个值,x是基准元素
while(true)
{
while(a[++i]<x&&i<r);//一直往下找,找到比x小的数,继续程序,要注意i不能越界
while(a[--j]>x);//继续往前找,找到比x大的数,继续程序
if(i>=j)break;//
Swap(a[i],a[j]);//
}
a[p]=a[j];
a[j]=x;
return j;
}
void Swap(int a,int b)
{
int temp=0;
temp=a;
a=b;
b=temp;
}
int main()
{
printf("待排数组为:\n");
for(int i=0;i<LEN;i++)
{
printf("%d,",a[i]);
}
printf("\n");
QuickSort(a,0,LEN);
}
int main()
{
printf("待排数组为:\n");
for(int i=0;i<LEN;i++)
{
printf("%d,",a[i]);
}
printf("\n");
QuickSort(a,0,LEN); //应该是 LEN - 1 吧
}