快排 排不出来~

August_1997 2017-12-19 12:47:20
直接上代码
大二数据结构与算法
照这书上的方法写的,与网上很多方法有所不同,该方法将轴值放在最后,确定两边区域后再放回
在测试时,发现有小偏差。代码调了很久没找到问题所在
太弱了

template <typename E>
inline int findpivot(E* ar, int i, int j)
{
return (i + j) / 2;
}
template <typename E>
inline int partition(E* ar, int left, int right)
{
int l = left;
int r = right - 1;

do {
while(ar[l++] < ar[right]) //find the element in the left area which bigger than pivot
l++;
while(l<r && ar[r] > ar[right])
r--;

swap(ar, l, r);
// printArray(ar+left, right - left + 1);
} while (l < r);

return r;
}
template <typename E>
void qsort(E *ar, int left, int right)
{
if(left >= right)
return;

int pivot = findpivot(ar, left, right);
swap(ar, pivot, right); //put pivot to the end
cout << "put the pivot "<< ar[right] << " to the end" << endl;
// printArray(ar+left, right-left+1);

int i = partition(ar, left, right);
swap(ar, i, right); //put pivot in the right position
cout << "put pivot back" << endl;
// printArray(ar, right - left + 1);

qsort(ar, left, i-1);
qsort(ar, i+1, right);
}
...全文
146 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
FoolCarpe 2017-12-20
  • 打赏
  • 举报
回复
wiki中快速排序的代码还是可以的
struct Range {
    int start, end;
    Range(int s = 0, int e = 0) {
        start = s, end = e;
    }
};
template <typename T> // 整數或浮點數皆可使用,若要使用物件(class)時必須設定"小於"(<)、"大於"(>)、"不小於"(>=)的運算子功能
void quick_sort(T arr[], const int len) {
    if (len <= 0)
        return; // 避免len等於負值時宣告堆疊陣列當機
    // r[]模擬堆疊,p為數量,r[p++]為push,r[--p]為pop且取得元素
    Range r[len];
    int p = 0;
    r[p++] = Range(0, len - 1);
    while (p) {
        Range range = r[--p];
        if (range.start >= range.end)
            continue;
        T mid = arr[range.end];
        int left = range.start, right = range.end - 1;
        while (left < right) {
            while (arr[left] < mid && left < right) left++;
            while (arr[right] >= mid && left < right) right--;
            std::swap(arr[left], arr[right]);
        }
        if (arr[left] >= arr[range.end])
            std::swap(arr[left], arr[range.end]);
        else
            left++;
        r[p++] = Range(range.start, left - 1);
        r[p++] = Range(left + 1, range.end);
    }
}
白衣如花 2017-12-19
  • 打赏
  • 举报
回复
while(ar[l++] < ar[right]) 改成 while(ar[l] < ar[right])试一试 比如 pivot = 5 ar: 4,6,7就出问题了
jiht594 2017-12-19
  • 打赏
  • 举报
回复
用出错数据调试一下不就行了、就用错误的2、3个数据调就行。 或者你把错误数据给出来 谁还给你一点点测吗

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧