快速排序
来源:互联网 发布:淘宝的直通车怎么开 编辑:程序博客网 时间:2024/06/08 10:25
思想:形参定为数组的上、下界(注意主函数所传实参为0、n-1,因为n-1的事儿我wrong了好多次),以升序为例,记录下标最小的数,
第一轮从后往前扫,遇到比标记数小的数时,做交换;同时改变移动方向,从前往后扫,遇到比标记数大的数就交换到后面,
交换时注意数组下标越界问题(想了好久才想通,越界作交换思路就错了);第一轮结束后可以找到最开始标记数的位置,把
标记数存进去。接下来依次对前面和后面调用递归(只做上下界的改变)
解题代码:
#include <stdio.h>
#define N 100000
void Input(int a[],int n)
{
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
}
void Quick(int a[],int low,int high)
{
int i,j,k,temp;
i=low;
j=high;
k=a[i];
if(i>j)
return ;
while(i!=j)
{
while(a[j]>k&&i<j)
j--;
if(i<j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
i++;
}
while(a[i]<k&&i<j)
i++;
if(i<j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
j--;
}
}
a[i]=k;
Quick(a,low,i-1);
Quick(a,i+1,high);
}
void Output(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
int main()
{
int a[N],n,k;
printf("请输入数据个数:\n");
scanf("%d",&n);
Input(a,n);
Quick(a,0,n-1);
Output(a,n);
return 0;
}
第一轮从后往前扫,遇到比标记数小的数时,做交换;同时改变移动方向,从前往后扫,遇到比标记数大的数就交换到后面,
交换时注意数组下标越界问题(想了好久才想通,越界作交换思路就错了);第一轮结束后可以找到最开始标记数的位置,把
标记数存进去。接下来依次对前面和后面调用递归(只做上下界的改变)
解题代码:
#include <stdio.h>
#define N 100000
void Input(int a[],int n)
{
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
}
void Quick(int a[],int low,int high)
{
int i,j,k,temp;
i=low;
j=high;
k=a[i];
if(i>j)
return ;
while(i!=j)
{
while(a[j]>k&&i<j)
j--;
if(i<j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
i++;
}
while(a[i]<k&&i<j)
i++;
if(i<j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
j--;
}
}
a[i]=k;
Quick(a,low,i-1);
Quick(a,i+1,high);
}
void Output(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
int main()
{
int a[N],n,k;
printf("请输入数据个数:\n");
scanf("%d",&n);
Input(a,n);
Quick(a,0,n-1);
Output(a,n);
return 0;
}
0 0