黎子卿 发表于 2023-11-20 21:21:11

希尔排序

#include <iostream>
using namespace std;
int main()
{
        int arr;
        int num;
        for (int i = 0; i < 10; i++)
        {
                cin >> num;
                arr = num;
        }
        for (int i = sizeof(arr) / 4 / 2; i > 0; i = i / 2)
        {
                for (int j = i; j < 10; j++)
                {
                        int temp = arr;
                        int index;
                        bool flag = false;
                        for (int k = j-i; k > 0; k = k - i)
                        {
                                if (arr > arr)
                                {
                                        arr = arr;
                                }
                                else
                                {
                                        index = k - i;
                                        flag = true;
                                        break;
                                }
                        }
                        if (flag)
                        {
                                arr = temp;
                        }
                }
        }
        for (int i = 0; i < 10; i++)
        {
                cout << arr << endl;
        }
        return 0;
}
这个希尔排序怎么不对啊
而且会报错

isdkz 发表于 2023-11-20 21:21:24

这段代码中的希尔排序实现有一些问题。首先,希尔排序的核心思想是将数组分成若干个子序列,分别进行插入排序,然后逐渐缩小增量直至为1,最终对整个数组进行一次插入排序。而你的代码中并没有按照这一思路来实现希尔排序。

此外,代码中的一些变量命名和逻辑也存在问题,导致了程序报错和排序结果不正确。

以下是经过修正的希尔排序的示例代码:

#include <iostream>
using namespace std;

void shellSort(int arr[], int n) {
    for (int gap = n / 2; gap > 0; gap /= 2) {
      for (int i = gap; i < n; i++) {
            int temp = arr[ i];
            int j;
            for (j = i; j >= gap && arr > temp; j -= gap) {
                arr = arr;
            }
            arr = temp;
      }
    }
}

int main() {
    int arr;
    for (int i = 0; i < 10; i++) {
      cin >> arr[ i];
    }
    shellSort(arr, 10);
    for (int i = 0; i < 10; i++) {
      cout << arr[ i] << endl;
    }
    return 0;
}


这段修正后的代码中,shellSort函数实现了希尔排序的核心逻辑,而且变量命名和逻辑更加清晰。在主函数中,我们输入数组后调用shellSort函数进行排序,然后输出排序结果。

Mike_python小 发表于 2023-11-20 21:23:00

这段代码存在以下几个问题:

1. 希尔排序的增量序列选取不当,可能会导致算法效率较低。实际上,希尔排序的增量序列有很多种,选取不同的增量序列可能会得到不同的排序效果。

2. 内部的插入排序实现有误,导致排序结果错误。具体来说,内部排序的时候应该将当前元素与已排好序的序列中的元素进行比较,而不是与数组中前一个元素比较。

3. 程序中存在一些语法错误,如循环条件不正确、变量名重复等。

下面是修改后的代码:

++
#include <iostream>
using namespace std;
int main()
{
    int arr;
    int num;
    for (int i = 0; i < 10; i++)
    {
      cin >> num;
      arr = num;
    }
    // 希尔排序
    for (int gap = sizeof(arr) / 4 / 2; gap > 0; gap /= 2)
    {
      for (int i = gap; i < 10; i++)
      {
            int temp = arr;
            int j;
            for (j = i; j >= gap && arr > temp; j -= gap)
            {
                arr = arr;
            }
            arr = temp;
      }
    }
    for (int i = 0; i < 10; i++)
    {
      cout << arr << endl;
    }
    return 0;
}


修改后的代码中,我们选取了希尔排序的一个常用增量序列:$n/2$,$n/4$,$n/8$,...,$1$。内部排序使用了插入排序算法,并且将数组元素与已排好序的序列中的元素进行比较。同时,我们也修正了一些语法错误,使得程序能够正确运行。

ba21 发表于 2023-11-22 21:34:52

#include <iostream>
using namespace std;

int main()
{
        int arr = {8, 11, 2, 3, 9, 7, 4, 6, 10, 1, 5};
        int i, j, gap, len, end, tmp;

        len = sizeof(arr) / sizeof(int);
        for (gap=len/2; gap>0; gap/=2) // 计算出组数
        {
                for (i=0; i<gap; i++) // 遍历每组
                {
                        // 使用直接排序法对每组数据进行排序
                        for (end=i+gap; end<len; end+=gap)
                        {
                                if(arr>arr)
                                {
                                        tmp = arr;
                                        for(j=end-gap; arr>tmp && j+gap!=i; j-=gap) // 在直接排序的基础上加上 起始位置 j+gap!=i
                                        {
                                                arr = arr;
                                        }
                                        arr = tmp;
                                }
                        }
                }
        }


        for (i=0; i<len; i++)
        {
                cout << arr << endl;
        }
        return 0;
}
页: [1]
查看完整版本: 希尔排序