为了账号安全,请及时绑定邮箱和手机立即绑定

求指正!C语言实现快速排序算法

求指正!C语言实现快速排序算法

酉时酒味浓 2018-03-21 01:47:49
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;
}

不要写和库函数如此类似的自定义函数。

另外,错误提示有给出错误发生的位置,心细一点就能发现了。

查看完整回答
1 反对 回复 2018-03-21
?
酉时酒味浓

TA贡献3条经验 获得超2个赞

//img1.sycdn.imooc.com//5ab22a7c0001ede308260607.jpg

print()函数改过来后又有新问题……妈耶,继续求助,谢谢各位大佬

查看完整回答
1 反对 回复 2018-03-21
?
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;
}

这个代码就不会无限递归了,但是还有其他的逻辑问题,你这段代码还有其他的错误。

查看完整回答
反对 回复 2018-03-21
  • 3 回答
  • 0 关注
  • 3428 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信