C语言实现快速排序算法,代码出错了,看了很久不懂错在哪里,求解,谢谢各位胖友!下面po上代码以及错误提示。(请忽略俺纠结的注释……)
#include<stdio.h>
#include<stdlib.h>
/*************************************
需要写三个函数
打印数组的函数print(int a[],int end)
快速排序一次划分的算法partition(int a[],int first,int end)
快速排序完整算法,递归调用,分治quicksort(int a[],int first,int end)
**************************************/
/*************************************
打印数组的函数print(int a[],int end)
用for循环,i++控制循环次数
**************************************/
void print(int a[], int end)
{
int i;
for(i=0; i<=end; i++)
{
print("%d,", a[i]);
}
printf("\n");
return;
}
/*************************************
快速排序一次划分的算法partition(int a[],int first,int end)
将i,j的值传给参数first,end
大前提是i<j,接着先扫描右边再扫描左边
具体:
i<j? 是 注:要一直进行该判断!
①a[i]<a[j]? 是(j--(即一直减到在右边扫描到一个比a[i]小的数,并记录此时j的值))
②a[i]<a[j]? 否(基准数与 a[j]交换,并i++(即先准备(记录)好下一轮从左边起的该扫描段的起点))
最后,返回i (心机婊,这个i是分界点,分水岭(处于这个点上的数意味着已经被排到了正确的位置上了))
“一直 ”用 while 循环
**************************************/
int partition(int a[],int first,int end)
{
int temp;
int i=first;
int j=end;
while(i<j)
{
while(a[i]<a[j])
{
j--;
}
if(i < j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
i++;
}
while (a[i] <= a[j])
{
i++;
}
if (i < j){
temp=a[i];
a[i]=a[j];
a[j]=temp;
j--;
}
}
return i;
}
/*************************************
快速排序完整算法,递归调用,分治quicksort(int a[],int first,int end)
调用函数partition()
使用partition()返回的分界点i
对i之前的那部分数用partition() ,
和对i之后的那部分数用partition()
**************************************/
void quicksort(int a[],int first,int end)
{
int point=partition(a,first,end);
quicksort(a, first, point-1);
quicksort(a, point+1, end);
return;
}
/*************************************
main函数
初始化数组,即写入待排序数组
并把值传给参数first,end
**************************************/
int main()
{
int a[]={2,3,8,1,9};
int first=0;
int end=4;
printf("原始数组:");
print(a,end);
quicksort(a,first,end);
printf("排序后:");
print(a,end);
system("pause");
return 0;
}错误提示: E:\C-SPACE\fang快速排序.cpp In function 'void print(int*, int)':26 21 E:\C-SPACE\fang快速排序.cpp [Error] cannot convert 'const char*' to 'int*' for argument '1' to 'void print(int*, int)'我是拿Dev-C++编译运行的。all……请各位大佬讲解时尽量简单详尽,或者告诉俺应该着重看哪个方面的内容……谢谢各位大佬了……for(i=0;i<1000000;i++){ printf("给大佬递茶");}
3 回答
已采纳
Jedenn
TA贡献4条经验 获得超2个赞
void print(int a[], int end) { int i; for(i=0; i<=end; i++) { print("%d,", a[i]); //这里出错了,不是print,而是printf。 } printf("\n"); return; }
不要写和库函数如此类似的自定义函数。
另外,错误提示有给出错误发生的位置,心细一点就能发现了。
Jedenn
TA贡献4条经验 获得超2个赞
void quicksort(int a[],int first,int end) { // 你这个递归函数没有终止条件,是无法返回的。递归调用无法终止, int point=partition(a,first,end); quicksort(a, first, point-1); quicksort(a, point+1, end); return; }
你这个递归函数没有终止条件,是无法返回的。递归调用无法终止,于是不停地在栈区压入函数调用,久而久之就超出了栈的大小(一般大小为2M),于是程序就尝试访问不该访问的内存,操作系统就触发一个segment fault的信号。
void quicksort(int a[],int first,int end) { if(first < end){ int point=partition(a,first,end); quicksort(a, first, point-1); quicksort(a, point+1, end); } return; }
这个代码就不会无限递归了,但是还有其他的逻辑问题,你这段代码还有其他的错误。
- 3 回答
- 0 关注
- 3428 浏览
添加回答
举报
0/150
提交
取消