gpt4 book ai didi

c++ - 实现混合插入和快速排序C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:51:14 25 4
gpt4 key购买 nike

我正在尝试实现混合插入和快速排序。任务是对大 vector 使用快速排序,只要 vector 变得小于某个指定值(交叉点),算法就应该切换到插入排序。到目前为止,我有这段代码,但它不对 vector 进行排序,我也不知道为什么。任何帮助,将不胜感激。谢谢!

#include <iostream>
#include "console.h"
#include "vector.h" // for Vector
#include <cmath>
using namespace std;


/* Partition for quicksort algorithm */
int partition(Vector<int> &vec, int start, int end){
int lh = start +1;
int rh = end;
int pivotVal = vec[start];

while (true){
while (lh<rh && vec[lh]<pivotVal) lh++;
while (rh>lh && vec[rh]>=pivotVal) rh--;
if (lh==rh) break;
swap(vec[lh], vec[rh]);
}

if (pivotVal<vec[lh]) return start;
swap(vec[start], vec[lh]);
return lh;
}


/* Regular quicksort */
void quickSort(Vector<int> &vec, int start, int end){
if(start<end){
int pivotIndex = partition(vec, start, end);
quickSort(vec, start, pivotIndex-1);
quickSort(vec, pivotIndex+1, end);
}
}


/* Insertion sort algorithm */
void insertionSort(Vector<int> &vec, int start, int end){
int size = vec.size();
for (int i=start; i<end; i++){
int j=i;
while (j>start && vec[j-1]>vec[j]){
swap(vec[j-1], vec[j]);
j--;
}
}
}



/* Hybrid quicksort & insertion sort, as soon as the part of the vector to
sort becomes less than the crossover value, the algorithm switches to
insertion sort, otherwise it
uses quicksort */
void hybridSort(Vector<int> &vec, int start, int end, int crossover){
if(start < end){
if (end-start <= crossover){
insertionSort(vec, start, end);
} else {
int pivotIndex = partition(vec, start, end);
hybridSort(vec, start, pivotIndex-1, crossover);
hybridSort(vec, pivotIndex+1, end, crossover);
}
}
}



int main() {

Vector<int> vec {9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 14, 39, 30, 83, 92, 41};
int end = vec.size()-1;
hybridSort(vec, 0, end, 4);
cout << vec.toString() <<endl;

return 0;

}

最佳答案

我重写了 partition :

int partition(Vector<int>& vec, int start, int end) {
int pivot = start;
for(int i = start + 1; i <= end; ++i) {
if(vec[i] < vec[pivot]) {
swap(vec[pivot + 1], vec[i]);
swap(vec[pivot], vec[pivot + 1]);
++pivot;
}
}
return pivot;
}

insertionSort 中也存在错误.应该是i <= end而不是 i < end .这是固定版本:

void insertionSort(Vector<int>& vec, int start, int end) {
for(int i = start; i <= end; i++) {
int j = i;
while(j > start && vec[j-1] > vec[j]) {
swap(vec[j-1], vec[j]);
j--;
}
}
}

关于c++ - 实现混合插入和快速排序C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50767557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com