快速排序

    快速排序是另一种基于分治技术的重要排序算法。不像合并排序是按照元素在数组中的位置对它们进行划分,快速排序按照元素的值对它们进行划分。

编译器为vc++6.0

#include<stdio.h>
#include<stdlib.h>
void Quicksort(int num[],int begin,int end);
int Partition(int num[],int begin,int end);
int main()
{
   FILE * fpRead;
   FILE * fpWrite;
   char * pchBuf;
   char  tmp[5];
   int Len;
   int i,j=0,k=0,nLen=0;
   int num[200];
   fpRead=fopen("bs-2.txt","r");    //以只读打开文件
   fseek(fpRead,0,SEEK_END);            //将文件指针移到结尾
   Len=ftell(fpRead);                   //计算文件长度
   rewind(fpRead);                      //将文件指针移到开头
   pchBuf=(char*)malloc(sizeof(char)*Len+1);    //在堆里开空间存放文件的内容
    if(!pchBuf)                             //如果没有分配退出
	{
	    printf("内存不够!\n");
		exit(0);
	}
    Len = fread(pchBuf,sizeof(char),Len,fpRead);  //将文件内容放入空间中,并自动调整长度
    fclose(fpRead);                              //关闭文件
	pchBuf[Len] = '\0';                      //将字符长结尾附零
	for (i=0;i<=Len;i++)                     
	{
	
		tmp[j++]=*(pchBuf+i);                //找到字符串开头
		if (*(pchBuf+i)==',' ||*(pchBuf+i)=='\0' )  //判断是否遇到逗号和结尾
		{    
			tmp[j] = '\0';                       //将子字符串附零
	        nLen++;
		  	num[k++]=atoi(tmp);                    //将字符串转化为整形
			j=0;                                  //查找下一个字符串
		}
	}                                              
    Quicksort(num,0,nLen-1);                    //快速排序
     fpWrite=fopen("bs.txt","w");               //打开要写入的文件
	 for(i=0;i<nLen;i++)
	 {
	    fprintf(fpWrite,"%d,",num[i]);           //将排好序的数组写入文件
		if(i%10==9)                              //每十个换一行
		fprintf(fpWrite,"\n");
	 }
	 fclose(fpWrite);                           //关闭文件
	 return 0;
}
/****************************************
//快速排序
//输入   一个待排序的数组  数组的开始位置  数组的结束位置
  输出  一个排好序的数组
*****************************************/
void Quicksort(int num[],int begin,int end)
{
	int s;        //s是分裂的位置
   if(begin<end)    //递归跳出位置
   {
      s=Partition(num,begin,end);//调用函数分成两个区
      Quicksort(num,begin,s-1);  //递归调用排序算法
      Quicksort(num,s+1,end);     //同上
   }
}
//分区算法
int Partition(int num[],int begin,int end)
{
    int p,j,i;
	i=begin;                  //赋值开始位置
	j=end;                    //赋值结束位置
	p=num[begin];
    while(i<j)/*循环结束条件*/
	{
       for(;j>i;j--)           //循环查找第一个小的位置后停止
	   {
           if(num[j]<p)
		   {
              num[i++]=num[j]; //交换
              break;
		   }
	   }

       for(;i<j;i++)          //循环查找第一个大的位置后停止
       {
            if(num[i]>p)
			{
                  num[j--]=num[i];  //交换
                  break;
			}
	   }
	}
    num[i]=p;                     //赋值中值
	return i;                     //返回中值的位置
}

输入文件为bx-2.txt

132,133,134,11,12,139,140,62,63,64,65,66,67,
1,2,3,4,5,6,7,48,49,50,138,16,17,20,
101,102,103,104,105,106,146,147,148,107,108,109,110,96,
21,22,23,24,25,25,27,28,29,30,
41,42,8,9,10,46,47,
51,52,53,54,55,56,57,58,59,60,
73,74,75,71,72,18,97,98,19,129,130,
137,136,13,14,144,145,15,128,
77,78,31,32,35,76,149,150,99,100,119,
91,92,93,94,95,116,117,114,118,120,
81,82,83,84,85,122,123,
112,111,43,44,45,113,115,36,37,38,39,40,25,126,127,
131,135,61,69,70,
141,142,143,86,68,87,90,
121,88,89,124,179,80,33,34

输出文件为bx.txt

1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,25,25,27,28,29,
30,31,32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,48,49,
50,51,52,53,54,55,56,57,58,59,
60,61,62,63,64,65,66,67,68,69,
70,71,72,73,74,75,76,77,78,80,
81,82,83,84,85,86,87,88,89,90,
91,92,93,94,95,96,97,98,99,100,
101,102,103,104,105,106,107,108,109,110,
111,112,113,114,115,116,117,118,119,120,
121,122,123,124,126,127,128,129,130,131,
132,133,134,135,136,137,138,139,140,141,
142,143,144,145,146,147,148,149,150,179,

实现了快速排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值