c++ - 混合合并排序和插入排序
问题描述
我正在尝试实现合并排序和插入排序的混合。当子数组大小低于阈值时,它应该切换到插入排序。然而,我尝试了一堆不同长度和不同阈值数量的数组,大多数时候没有任何明显的差异,除了 2-3 个较小的比较。有人告诉我,为较小的数组切换到插入排序会有很大帮助。
我做错了吗?
#include <iostream>
int comparisons = 0;
int swaps = 0;
void mergesort(int x[], int l, int r);
void insertionSort(int x[],int start, int end);
int main() {
int x[] = {9,5,1,4,3,10,29,69,5,9,11,19,21,69,0,2,3,4,5,11,111,96,25,32,21,2,12,3,52,55,23,32,15,15,14,13,9,5,1,4,3,10,29,69,5,9,11,19,21,69,0,2,3,4,5,11,111,96,25,32,21,2,12,3,52,55,23,32,15,15,14,13,};
// insertionSort(x,10);
int sizeX= sizeof(x)/sizeof(x[0]) ;
mergesort(x, 0, sizeX-1);
for(int i =0;i<sizeX;i++){
std::cout << x[i] << " ";
}
// std::cout << "\nSWAPS: " << swaps;
std::cout << "\nCOMPARISONS: " << comparisons;
}
void insertionSort(int arr[], int start,int end)
{
int i, key, j;
for (i = start +1 ; i < end; i++)
{
key = arr[i];
j = i - 1;
/* Move elements of arr[0..i-1], that are
greater than key, to one position ahead
of their current position */
while (j >= 0 && arr[j] > key)
{
comparisons++;
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
void insertionSort2(int x[],int start, int end){
for(int i =start; i < end;i++){
for (int j= i; j!= 0;j--){
comparisons++;
if(x[j] < x[j-1]){
int temp = x[j-1];
x[j-1] = x[j];
x[j] = temp;
swaps++;
}
else{
break;
}
}
}
}
void mergesort(int x[], int l, int r) {
if (l >= r)
return;
int mid = (l + r) / 2;
if(r - l < 3){
insertionSort(x, l,r+1);
}else{
mergesort(x, l, mid);
mergesort(x, mid + 1, r);
int i = l;
int j = mid + 1;
int k = 0;
int tmp[r - l + 1];
while (i <= mid && j <= r) {
comparisons++;
if (x[i] >= x[j]) {
tmp[k] = x[j];
j++;
} else {
tmp[k] = x[i];
i++;
}
swaps++;
k++;
}
while (i <= mid) {
tmp[k] = x[i];
i++;
k++;
}
while (j <= r) {
tmp[k] = x[j];
j++;
k++;
}
for (i = 0; i < k; i++) x[l + i] = tmp[i];
}
}
解决方案
推荐阅读
- xml - 解析 ChildNodes 的 ChildNodes
- r - 尝试部署闪亮的应用程序时出错
- c# - 如何设置获取;放; 来自另一个脚本的值
- c# - 我正在尝试将数据插入到对象的二维数组中
- r - R - 对每个学习者具有不同特征子集的超级学习者的建议?
- c# - 如何在列表中查找类对象
通过一个或多个类字段? - javascript - 用 puppeteer 写一个 csv 文件
- java - IllegalStateException:请考虑在值和/或键反序列化器中配置“ErrorHandlingDeserializer”
- python-3.x - Python requests.Session() 没有更新所有 cookie?
- javascript - Redux:useSelector 值未定义,尽管它出现在 devTools 中