当前位置:  开发笔记 > 编程语言 > 正文

C++:按升序排序数组的初始部分,按降序排列另一部分

如何解决《C++:按升序排序数组的初始部分,按降序排列另一部分》经验,为你挑选了1个好方法。

我是新的C++,我试图做此:

我有一个N元素的数组.用户应该能够输入阵列和数目的所有元素ķ.之后,我必须对数组进行排序,使第一部分(元素1K)按升序模式排序,第二部分(元素KN)按降序排序.

排序功能由我自己实现.我可以使用快速排序的cstdlib,但它不是那么有趣.

我已编码排序数组,但我无法理解如何将数组分为两部分.

#include 
#include 

void print_array(int[], int);
void qsort(int[], int, int);

int main()
{
    int array_length;
    int *array, k;
    std::cout << "Write array length: ";
    std::cin >> array_length;
    array = new int[array_length];
    for (int i = 0; i < array_length; i++) {
        std::cout << "Write " << i + 1 << " element: ";
        std::cin >> array[i];
    }
    print_array(array, array_length);
    do {
        std::cout << "Write k: ";
        std::cin >> k;
    } while (k >= array_length);
    qsort(array, 0, k);
    print_array(array, array_length);
}


void print_array(int* array, int length) {
    for (int i = 0; i < length; i++) {
        std::cout << array[i] << "\n";
    }
}

void qsort(int arr[], int fst, int last)
{
    int i, j, pivot, tmp;
    if (fst < last)
    {
        pivot = fst;
        i = fst;
        j = last;
        while (i < j)
        {
            while (arr[i] <= arr[pivot] && i < last)
                i++;
            while (arr[j] > arr[pivot])
                j--;
            if (i < j)
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
        tmp = arr[pivot];
        arr[pivot] = arr[j];
        arr[j] = tmp;
        qsort(arr, fst, j - 1);
        qsort(arr, j + 1, last);
    }
}

P.P... 5

你正在排序一半:

qsort(array, 0, k);

同样,你需要排序另一半:

qsort(array+k, 0, array_length-k);

现在,问题在于两个部分都将按升序排列.所以你需要一种方法告诉qsort()我们按升序排序一半,另一半按降序排序.传递另一个标志以qsort()更改交换顺序.所以你可以用bool它来表示它:

void qsort(int arr[], int fst, int last, bool pass)
{
           ....
           if (pass && i < j)
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
            if(!pass && i > j) {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
       ...
       qsort(arr, fst, j - 1, pass); 
       qsort(arr, j + 1, last, pass);

}

当你调用它时,你可以传递truefalse"切换"交换顺序:

  qsort(array, 0, k, true);
  qsort(array+k, 0, array_length-k, false);

相应地改变原型qsort().



1> P.P...:

你正在排序一半:

qsort(array, 0, k);

同样,你需要排序另一半:

qsort(array+k, 0, array_length-k);

现在,问题在于两个部分都将按升序排列.所以你需要一种方法告诉qsort()我们按升序排序一半,另一半按降序排序.传递另一个标志以qsort()更改交换顺序.所以你可以用bool它来表示它:

void qsort(int arr[], int fst, int last, bool pass)
{
           ....
           if (pass && i < j)
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
            if(!pass && i > j) {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
       ...
       qsort(arr, fst, j - 1, pass); 
       qsort(arr, j + 1, last, pass);

}

当你调用它时,你可以传递truefalse"切换"交换顺序:

  qsort(array, 0, k, true);
  qsort(array+k, 0, array_length-k, false);

相应地改变原型qsort().

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有