二分法快速排序

风格不统一 提交于 2020-01-10 03:58:36

我在实现二分法快速排序的时候,最初的程序是这样的。

#include<iostream>
using namespace std;

void qsort(int arr[],int left,int right)
{
    int l = left;int r = right;
    int value = arr[l];
    do
    {
        while(l < r && arr[r] >= value)r--;
        if(arr[r] < value){arr[l] = arr[r];l++;}

        while(l < r && arr[l] <= value)l++;
        if(arr[l] > value){arr[r] = arr[l];r--;}
    } while (l != r);
    arr[l] = value;
    qsort(arr,left,r--);
    qsort(arr,l++,right);
    
}

int a[100];
int main()
{
    freopen("1.txt", "r", stdin);
    freopen("2.txt", "w", stdout);
    int n;cin >> n;
    for(int i = 0;i < n ;i++)
        cin >> a[i];
    qsort(a,0,n-1);
    for(int i = 0;i < n;i++)
        cout << a[i];

}

这时的报错有/bin/sh: line 1: 12518 Segmentation fault: 11
据说是因为内存越界?
检查发现,我把边界点写错了qsort(arr,left,r--); qsort(arr,l++,right);大错特错,还忘了写递归边界

修改后

#include<iostream>
using namespace std;

void qsort(int arr[],int left,int right)
{
    if(left > right)return;
    int l = left;int r = right;
    int value = arr[l];
    do
    {
        while(l < r && arr[r] >= value)r--;
        if(arr[r] < value){arr[l] = arr[r];l++;}

        while(l < r && arr[l] <= value)l++;
        if(arr[l] > value){arr[r] = arr[l];r--;}
    } while (l != r);
    arr[l] = value;
    qsort(arr,left,l-1);
    qsort(arr,r+1,right);
    
}

int a[100];
int main()
{
    freopen("1.txt", "r", stdin);
    freopen("2.txt", "w", stdout);
    int n;cin >> n;
    for(int i = 0;i < n ;i++)
        cin >> a[i];
    qsort(a,0,n-1);
    for(int i = 0;i < n;i++)
        cout << a[i];

}

就ac了

在这里插入图片描述
好喜欢这一句话

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!