我正在尝试反转clr中描述的插入排序逻辑中的已排序部分和未排序部分。输出完全错误。有人能指出我代码中的错误或逻辑错误吗。

#include<stdio.h>
#include<stdlib.h>

int main()
{   int a[] = {67,7,3,2,1,9,45,5};
    int k;
    int n = sizeof(a)/sizeof(a[0]);
    insert(a,n);
    for(k = 0;k < n; k++)
        printf("%d %d\n",k,a[k]);
    return 0;
}

void insert(int *a,int n)
{
    int i,j,val;
    for(i=n-2;i>=0;i--){
        val=a[i];
        for(j=i+1;j<n && a[j]<val;j++){
            a[j-1]=a[j];
        }
        a[j--]=val;
}

最佳答案

您应该在a[j - 1]处插入最后一个元素。可以使用减量来实现这一点,但在这种情况下,必须使用前缀减量,这将在引用该值之前更改该值:a[--j] = val;
以下是更正版本:

void insertion_sort_backwards(int *a, int n)
{
    int i = n - 1;

    while (i--) {
        int val = a[i];
        int j;

        for (j = i + 1; j < n && a[j] < val; j++) {
            a[j - 1] = a[j];
        }

        a[j - 1] = val;
    }
}

这将从右侧对数组进行排序:
67, 7, 3, 2, 1, 9, 5, 45
67, 7, 3, 2, 1, 5, 9, 45
67, 7, 3, 2, 1, 5, 9, 45
67, 7, 3, 1, 2, 5, 9, 45
67, 7, 1, 2, 3, 5, 9, 45
67, 1, 2, 3, 5, 7, 9, 45
1, 2, 3, 5, 7, 9, 45, 67

关于algorithm - 插入方向相反。右侧的已排序部分,左侧的未排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34736486/

10-15 02:11
查看更多