快速排序法有问题,求解析(排列一万个以上有序数列会中断)

数组快速排序,当数组元素大于一万,有序元素排序就出现中断,并且下面的代码都没有执行,弄了大半天都找不到原因。。。代码如下:

#include <stdio.h>
#include <time.h>
#include <windows.h>
/*
 快速排序十万个数,仅需0.031秒
 就是弄不懂一个现象,当待排序的个数在一万(精确到9962)以上并且此数是有序的(从大到小或从小到大)时,
 比如排过一次的数组,再次排序时就没有往下执行。。。什么原因呢?
*/

#define NN 9963  //9593//9963

int one_pai(int a[],int tou,int wei);
void digui(int a[],int tou,int wei);

int one_pai(int a[],int tou,int wei)
{
 int i,j,tmp,tmp_1=tou,tmp_2=wei;
 while(1)
 {
  for(i=tmp_1+1;i<wei;i++)//从左往右找比头大的数
  {
   if(a[tou]<a[i])
   {
    break;
   }
  }
  for(j=tmp_2;j>tou;j--)//从右往左找比头小的数
  {
   if(a[tou]>a[j])
   {
    break;
   }
  }
  if(j>i)//如果i和j还没相遇
  {
   //交换i位置和j位置的数,并且记录当前值
   a[i]=a[i]+a[j];
   a[j]=a[i]-a[j];
   a[i]=a[i]-a[j];
   tmp_1=i;
   tmp_2=j-1;
  }
  else//如果i、j相遇(交错)
  {
   //头和j交换,并且返回j的位置
   tmp  =a[j];
   a[j] =a[tou];
   a[tou] =tmp;
   return j;
  }
 }

}

void digui(int a[],int tou,int wei)
{
 int k;
 if(tou<wei)
 {
  k=one_pai(a,tou,wei);
  digui(a,tou,k-1);
  digui(a,k+1,wei);
 }
}


int main(void)
{
 int i;
 int a[NN]={0};
 srand((unsigned)time(NULL));//初始化随机函数种子
 for(i=0;i<NN;i++)
 {
  a[i]=rand();//产生一个随机数赋值给a[i]
 }

 //排序前
 printf("排序前:\n");
 for(i=0;i<NN;i+=1000)
 {
  printf("a[%d]=%d\n",i,a[i]);
 } 
 printf("a[%d]=%d\n\n",NN-1,a[NN-1]);//最后一个数

 digui(a,0,NN-1);//快速排序

 //排序后
 printf("排序后:\n");
 for(i=0;i<NN;i+=1000)
 {
  printf("a[%d]=%d\n",i,a[i]);
 } 
 printf("a[%d]=%d\n\n\n",NN-1,a[NN-1]);//最后一个数
 

 //已经排好序了,重排一次
 printf("已经排好序了,重排一次:\n");
 digui(a,0,NN-1);//快速排序
 printf("这一句都没有执行!!\n");
 for(i=0;i<NN;i+=1000)
 {
  printf("a[%d]=%d\n",i,a[i]);
 }
 printf("a[%d]=%d\n",NN-1,a[NN-1]);//最后一个数
 
 return 0;
}

posted @ 2012-10-17 11:36  我想玩野  阅读(364)  评论(0)    收藏  举报