首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

排序算法解决办法

2013-11-26 
排序算法void quick_sort(int a[],int left,int right){int ileft+1,jright+1int keya[left]if(left

排序算法
void quick_sort(int a[],int left,int right)
{
int i=left+1,j=right+1;
int key=a[left];

if(left >=right) return ;

while(1)
{
while(a[j] > key) j--;
while(a[i] < key && i<j) i++;
if(i >= j) break;
swap(&a[i],&a[j]);

if(a[i] == key)
j--;
else
i++;
}
swap(&a[left],&a[j]);
    if(left <i-1)
quick_sort(a,left,i-1);
if(j+1<right)
quick_sort(a,j+1,right);
}

int main()
{
int a[]={0,-1,11,-14,5,15,-4,14};
int size=sizeof(a)/sizeof(a[0]);
printf("size:%d\n",size);
quick_sort(a,0,size);
printf("size:%d\n",size);
for (int i=0;i<size;i++)
printf("%d\t",a[i]);

printf("\n");
return 0;
}
输出size的值,为什么调用quick_sort后size的值改变了,数组a中又增加了一些无意思的数据

-14     -4      -1      0       5       8       11      14      15      9      -1076835776      -1076835688     1699484 1576096 134514176       -1076835688    1699484  1       -1076835644     -1076835636     1579048
而size的值变为15
算法,内存
[解决办法]

引用:
Quote: 引用:

因为你的快排写得有问题,栈溢出了,然后吧size的值给覆盖了,那个15应该是你数据里的15,排序后正好在那个位置上。

能不能看是哪出的问题??
void quick_sort(int a[],int left,int right)
{
int i=left,j=right;//不需要+1
int key=a[left];

if(left >=right) return ;

while(1)
{
while(a[j] > key && i<j) j--;//这里最好补上i<j
while(a[i] < key && i<j) i++;
if(i >= j) break;
swap(&a[i],&a[j]);
if(a[i] == key)
j--;
else
i++;
}
a[j]=key;//这句写错了,不是swap,是赋值
if(left <i-1)
quick_sort(a,left,i-1);
if(j+1<right)
quick_sort(a,j+1,right);
}

int main()
{
int a[]={0,-1,11,-14,5,15,-4,14};
int size=sizeof(a)/sizeof(a[0]);
printf("size:%d\n",size);
quick_sort(a,0,size-1);//参数传递错误,下标是0 - size-1
printf("size:%d\n",size);
for (int i=0;i<size;i++)
printf("%d\t",a[i]);
printf("\n");
return 0;
}

[解决办法]
void QuickSort(Type a[], int left, int right)  
{  
    if(left < right)  
    {  
        int i = left, j = right, key = a[left];  
        do{  
            while(i < j && a[j] >= key)  
                j--;  
            if(i < j) a[i++] = a[j];  
            while(i < j && a[i] < key)  
                i++;  
            if(i < j) a[j--] = a[i];  
        }while(i != j);  
        a[i] = key;  
        QuickSort(a, left, i-1);  
        QuickSort(a, i+1, right);  
    }     
}  


left 是数组下标第一个存在的值,right是数组下标最后一个存在的值

稍微改了下 直接一个函数解决了

热点排行