我已经写了一个快速的排序代码,逻辑看起来很正确,但是控制台上没有输出

时间:2019-07-09 15:33:37

标签: c++ quicksort

我写了一个快速排序代码,逻辑看起来很正确,但控制台上没有输出。

当仅索引函数运行时,输出正确,并且输出循环也正确,但是当添加quicSort函数时,将没有输出。

#include <iostream>
using namespace std;
int index(int* a, int s, int e) {
  int i, j, start, piv, temp;
  start = s;

  piv = a[e];

  for (i = start; i <= e; i++) {
    if (a[i] <= piv) {
      temp = a[i];
      a[i] = a[start];
      a[start] = temp;
      start++;
    }
  }

  return start;
}

void quickSort(int* a, int s, int e) {
  int pivot;
  if (s < e) {
    pivot = index(a, s, e);
    quickSort(a, s, pivot - 1);
    quickSort(a, pivot + 1, e);
  }
}

int main() {
  int A[] = {2, 5, 8, 3, 6, 9, 1, 4};
  quickSort(A, 0, 7);

  for (int i = 0; i < 8; i++) {
    cout << A[i];
  }

  return 0;
}

输出应为数组排序

2 个答案:

答案 0 :(得分:2)

代码需要两个修复。评论中记录的更改:

#include <iostream>
using namespace std;
int index(int* a, int s, int e) {
  int i, start, piv;            // j, temp not used
  start = s;

  piv = a[e];

  for (i = start; i <= e; i++) {
    if (a[i] < piv) {           // fix (not <=)
      swap(a[i], a[start]);     // simplify
      start++;
    }
  }
  swap(a[start], a[e]);         // fix (swap pivot into place)

  return start;
}

void quickSort(int* a, int s, int e) {
  int pivot;
  if (s < e) {
    pivot = index(a, s, e);
    quickSort(a, s, pivot - 1);
    quickSort(a, pivot + 1, e);
  }
}

int main() {
  int A[] = {2, 5, 8, 3, 6, 9, 1, 4};
  quickSort(A, 0, 7);

  for (int i = 0; i < 8; i++) {
    cout << A[i] << " ";        // put space beteen numbers
  }
  cout << endl;

  return 0;
}

答案 1 :(得分:0)

我认为您在创建快速排序程序时会对Bubblesort感到困惑。

quicksort的思想是将向量分解为较小的向量,一个向量的数目大于枢轴e,另一个向量的数目小于枢轴。

您应该将代码四舍五入为向量之类的C ++数据结构。

一个例子是,使用c ++ 11:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <numeric>
#include <vector>

using namespace std;

vector<int> quicksort(vector<int> data) {
  if (data.size() == 1) return data;
  vector<int> small_numbers;
  vector<int> big_numbers;
  vector<int> ret;
  float pivot = accumulate(data.begin(), data.end(), 0.0) / data.size();

  for (int value : data) {
    if (value < pivot) {
      small_numbers.push_back(value);
    } else {
      big_numbers.push_back(value);
    }
  }
  if (small_numbers.empty()) return big_numbers;

  small_numbers = quicksort(small_numbers);
  big_numbers = quicksort(big_numbers);

  ret.insert(ret.end(), small_numbers.begin(), small_numbers.end());
  ret.insert(ret.end(), big_numbers.begin(), big_numbers.end());

  return ret;
}

int main() {
  vector<int> A({2, 5, 8, 3, 6, 9, 1, 4});

  A = quicksort(A);

  for (int value : A) cout << value << endl;

  return 0;
}

此示例将向量分为两个向量,枢轴是向量值的平均值。它以递归方式调用该函数,直到调用一个大小为1个元素的向量为止。

希望它可以将您引导到一种更为简单的快速排序方式。