数据结构与算法分析(C语言描述)中快排的实现是不是有问题啊为啥vs2013编译没报错,但是却没输出呢
楼上说的对啊,你stdafx和tmain什么鬼?怀疑你是怎么学的C语言。。。重学吧骚年。发现写个给新人的vs2013怎么用的教程很是有必要,等我洗澡吃饭回来就发!Visual Studio2013适合新手练习C语言吗? - 用户的回答
■网友
题主你省略了 Weiss 代码中对数组元素个数小于 `CUTOFF` 时的处理, Weiss 代码逻辑非常缜密, Median3 的作用不光是找出 pivot, 同时还设立了两个哨兵, 然而当数组元素少于 3 的时候 Median3 的机制就不适用了, 结果就是分区过程从右向左搜索元素时会越界.所以 Weiss 用 `CUTOFF` 区分处理了这两种情况, 当然另一个原因是当数组元素个数较少时, 快排的优势反而成了劣势
■网友
首先去掉stdafx.h,入口函数名字改回main,g++ Quick_Sort.cpp -o sort
编译能过。./sort
提示 Segmentation fault (core dumped) ,数组越界。把维斯的原书下载下来看了快排那一节,书上提供的代码没错,而且对于边缘条件的处理相当精细,在作者的代码中,Median3不但找出当前数组的枢轴,而且使得a \u0026lt;= pivot == a \u0026lt;= a。这样a和a就已经落在了合适的地方,无需参与下面的循环,且可以对i和j起界限作用,避免越界。然而数组只有1个或2个元素时,上述机制就会出问题。作者的意图是如果数组S中元素个数少于cutoff + 1,则使用插入排序,这样可以提高性能并且避开Median3的边缘条件。而你的代码试图对数组递归地进行快排,导致对长度为1和2的数组进行快排时索引越界。解决办法有两个:可以取消Median3函数,改成把当前数组S第一个元素当做pivot,这样就可以纯用快排对数组排序,不过作者不推荐这么做;加上一个CUTOFF,对于小于CUTOFF的数组,用插入排序进行处理,同时避免Median3的副作用,这是作者的做法;基于第2种办法可以对程序做如下补充:#define CUTOFF 3void insert_sort(int* a, int len){ int j; for (j=1; j\u0026lt;len; j++) { int i = j - 1; int key = a; while (a \u0026gt; key \u0026amp;\u0026amp; i \u0026gt;= 0) { a = a; i--; } a = key; }}void QuickSort(int A, int left, int right){ //如果数组中元素个数少于CUTOFF + 1,则使用插排 if (left + CUTOFF \u0026lt;= right) { int pivot = Median3(A, left, right); //现在a\u0026lt;=pivot, a\u0026gt;=pivot, a=pivot int i = left; int j = right - 1; while (1) { while (A \u0026lt; pivot){} while (A \u0026gt; pivot){} if (i \u0026lt; j) swap(A, A); else break; } //现在把pivot放在A上,a将数组分成符合需要的前后两块 swap(A, A); QuickSort(A, left, i - 1); QuickSort(A, i + 1, right); } else insert_sort(A + left, right - left + 1);}
基于第一种办法,你可能需要在Quicksort函数里判断待排数组是否只有1或2个元素,比较麻烦;或者放弃Median3取中值函数,直接把a当pivot,这样可以递归到底。
■网友
tmain 我觉得很好啊, 你在vs项目里就改个unicode设置,分分钟切换工程的unicode属性.还让你顺便学学wchar_t 这种非主流的知识.可见微软真是我们程序员的贴心小棉袄. 他预见了很多很好的东西.虽然不标准.但 标准这东西不也是由一帮老古董程序员开会弄出来的吗?举个例子.比如说Opengl 和 directx , gl么就是典型的开放标准.结果每次开会尽是扯皮.进步缓慢.而dx 就是微软一人主导. 后来成了超越gl的标准.所以微软就是先进生产力的代表. 尽管我周围很多gl粉 见了微软就骂.但没用,再眼红你们也是乌龟.总也会被微软兔子甩远!
推荐阅读
- |新款领克01竞争力分析:推荐入门版 价格门槛提高2.9万元
- 为啥这个算法误差的看起来这么小
- 写下我关于做数据分析专员的困惑和各位的建议是
- 汽车知识|五菱凯捷vs吉利嘉际,客观分析5点,谁更适合日常家用?怎么选?
- 高考|提前了解,快人一步!2021年“新高考”数学试卷结构&题型分析
- 达内集团管理培训生
- 使用算法帮助人们筛选reader的信息是否存在可能
- 纯电|2020年37批新能源车免车购税目录分析
- |东风悦达起亚智跑部分车型出现发动机异响拉缸的潜在缺陷风险分析
- 请问如果想成为算法工程师的话,大学选专业是选软件工程好还是计算机科学与技术好。