读取data.txt中的数据,利用快速排序算法从大到小输出到output.txt中
快速排序基本思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
#include<stdio.h>
#include<stdlib.h>
//Method1:将基准数不断替换,直到此数到达中间(此法尚存bug,第一个和最后一个数相同时,死循环)
void quicksort1(int qs[],int left,int right)
{
if(left<right)
{
int i,j,m,tep;
m=qs[left];
i=left;
j=right;
while(i<j)
{
while(qs[j]>m&&i<j)
j--;
while(qs[i]<m&&i<j)
i++;
if(i<j)
{
tep=qs[i];
qs[i]=qs[j];
qs[j]=tep;
}
}
quicksort1(qs,left,i-1);
quicksort1(qs,i+1,right);
}
}
//Method2:挖坑填数
void quicksort2(int qs[],int left,int right)
{
if(left<right)
{
int i,j,m,tep;
m=qs[left];
i=left;
j=right;
while(i<j)
{
while(qs[j]>=m&&i<j)
j--;
if(i<j)
qs[i++]=qs[j];
while(qs[i]<m&&i<j)
i++;
if(i<j)
qs[j--]=qs[i];
}
qs[i]=m;
quicksort2(qs,left,i-1);
quicksort2(qs,i+1,right);
}
}
int main()
{
int n,i;
FILE *fp1,*fp2;
fp1=fopen("data.txt","r");
fp2=fopen("output.txt","w");
fscanf(fp1,"%d",&n); //读取第一个数
//为数组qs分配空间
int *qs=(int*)malloc(sizeof(int)*n);
printf("原始数组为:");
for(i=0;i<n;i++)
{
fscanf(fp1,"%d",&qs[i]);
printf("%d ",qs[i]);
}
printf("\r\n");
quicksort2(qs,0,n-1); //调用函数
printf("排序后数组:");
for(i=0;i<n;i++)
{
fprintf(fp2,"%d ",qs[i]);
printf("%d ",qs[i]);
}
printf("\r\n排序后数组已写入output.txt\r\n");
fclose(fp1);
return 0;
}