【问题标题】:What kind of sort is this? - C [closed]这是什么品种? - C [关闭]
【发布时间】:2022-01-05 02:30:43
【问题描述】:

我写这篇文章是为了一个任务,按重量排序我做的一组结构,然后按名称的字母顺序,想知道这是什么类型的排序?

void sortPR(stuct m *arr, int n_nodes) {
    for (int i = 0; i < n_nodes; i++) {

        // Sort in descending order for weight
        for (int k = i + 1; k < n_nodes; k++) {

            // If weight equal, sort alphabetically
            if (arr[i].weight == arr[k].weight) {

                // Sort alphabetically
                if (strcmp(arr[i].name, arr[k].name) > 0) {
                    swap(&arr[i], &arr[k]);
                }
            } else if (arr[i].weight < arr[k].weight) {
                swap(&arr[i], &arr[k]);
            }
        }
    }
}

【问题讨论】:

  • @TauqeerAkhtar 这不是冒泡排序比较条件。这看起来像选择排序
  • 选择排序最小化交换次数:-)

标签: c sorting


【解决方案1】:

看起来像是带有冗余元素交换的选择排序。

通常,对于选择排序,只在内部 for 循环之后进行一次元素交换,而内部 for 循环仅确定索引为 i 的元素在需要时将与之交换的元素的索引。

【讨论】:

  • 我觉得就是这个!!!
【解决方案2】:

sortPR 执行Selection Sort 的变体,通过额外的交换来对数组进行排序,方法是通过在name 上使用辅助键减少weight,对相同的weight 按字典顺序排序。

性能相当糟糕,所有情况下的时间复杂度都是O(N2)(与插入排序不同),但对于小型数组,这不会很重要,实施很简单,很容易做对。相反,快速排序复杂且容易出错。

此外,与冒泡排序和插入排序不同,选择排序不保证稳定性,不保留比较相同的元素的相对顺序:B1 B2, A 将排序为 A, B2 , B1。你的实现行为不同,但也有这个缺陷。

字典顺序与字母顺序并不完全相同:大小写很重要,字母、数字和标点符号的相对顺序取决于系统中使用的字符集。

这是一个修改后的版本,更接近典型的选择排序,交换次数更少:

void sortPR(stuct m *arr, int n_nodes) {
    for (int i = 0; i < n_nodes; i++) {
        int i1 = k;

        // Sort in descending order for weight
        for (int k = i + 1; k < n_nodes; k++) {

            // If weight equal, sort alphabetically
            if (arr[i].weight == arr[k].weight) {

                // Sort alphabetically
                if (strcmp(arr[i].name, arr[k].name) > 0) {
                    i1 = k;
                }
            } else if (arr[i].weight < arr[k].weight) {
                i1 = k;
            }
        }
        if (i != i1) {
            swap(&arr[i], &arr[i1]);
        }
    }
}

【讨论】:

  • 没有相邻项的比较..怎么冒泡排序?
  • omg 很抱歉造成了混乱哈哈,我在网上查了一个随机排序并对其进行了改编,现在我不知道我已经将它改编成什么了>。
  • @SurajRao:确实是插入排序的一种变体:)。
猜你喜欢
  • 2017-09-17
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 2012-09-07
  • 2022-01-21
相关资源
最近更新 更多