测试希尔排序的稳定性算法


#include<iostream>
using namespace std; 
#include"ShellSort.h"
#include"swap.h"
int comparisons2 = 0;
int moves2 = 0; 
bool stable2 = true;
void ShellSort(int arr[], int n, int& comparisons, int& moves)
{
    // 创建辅助数组,保存原始索引位置
    int* aux = new int[n];
    for (int i = 0; i < n; i++)
    {
        aux[i] = i;
    }
    int gap = n / 2;
    while (gap > 0)
    {
        for (int i = gap; i < n; i++)
        {
            int temp = arr[i];
            int tempAux= aux[i];
            int j = i;

            // 将arr[j-gap]与arr[j]进行比较并交换位置
            while (j >= gap && arr[j - gap] > temp)
            {
                arr[j] = arr[j - gap];
                aux[j] = aux[j - gap];
                j -= gap;
                comparisons2++;//关键字比较一次
                moves2++;//关键字移动一次
            }

            arr[j] = temp;
            aux[j] = tempAux;
            moves2++;//关键字移动一次
        }

        // 更新增量值
        gap /= 2;
    }
    // 验证稳定性
    
        
        for (int i = 1; i < n; i++)
        {
            // 如果值相等,但是索引位置发生变化,则说明不稳定
            if (arr[i] == arr[i - 1] && aux[i] < aux[i - 1])
            {
                stable2 = false;
                break;
            }
        }
       
    
}

void test2(bool &stable)
{
    if (stable2)
    {
        cout << "希尔排序是稳定的" << endl;
    }
    else
    {
        cout << "希尔排序是不稳定的" << endl;
    }
}

这个用辅助数组验证稳定性的方法是在网上找的,我感觉逻辑没什么问题,但是输出希尔排序是稳定的,不过希尔排序不是不稳定的吗,我不知道哪里出了问题,帮我找一下谢谢

测试稳定性需要通过多组数据来验证,至少包括:
(1)随机数组
(2)递增数组
(3)递减数组
(4)完全重复数组
且数据量必须足够大!
所以,你需要定义4个以上数组(随机数组可以定义多个),然后再判断就可以了

稳定指的是任何时候排序过后索引的相对位置都不变
而你传入了一个数组,这只是验证了其中一种情况而已,不能说就是稳定的
说的极端一点
我随便定义一个数组{1,2,3}
这东西拿任何一种算法来排,都不可能不稳定,因为里面根本连重复的元素都没有,索引怎么可能会变