Shell排序程序

时间:2015-02-12 16:35:01

标签: c sorting

我不是排序方面的专家,但根据我的理解,以下程序应该有效。不幸的是,它并不总是奏效。你能帮我弄清楚它有什么问题吗?谢谢。以下是代码:

/*
* Question4.c
*
*  Created on: 12 Feb 2015
*      Author: Daniel
*/

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

#define SIZE 10

int main(void)
{

    int array[SIZE], i, gap,temp, k, m;

    srand(time(NULL));
    for (i=0; i<SIZE; i++) {
        array[i] = rand();
    }
    for (i=0; i<SIZE; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
    gap = SIZE/2;
    k=0;
    while(gap!=1) {
        gap = gap/2;
        k++;
    }
    m=k;
    gap = (SIZE)/2;
    k=0;
    while(k!=m+1) {
        for (i=gap; i<SIZE; i++) {
            if (array[i-gap]>array[i]) {
                temp = array[i];
                array[i] = array[i-gap];
                array[i-gap] = temp;
            }
        }
        gap = (int)(gap  / 2);
        k++;
    }
    for (i=0; i<SIZE; i++) {
        printf("%d ", array[i]);
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您的算法不正确。您进行排序的部分仅使用一次传递,但它需要是完整的插入排序或冒泡排序。换句话说,这个:

for (i=gap; i<SIZE; i++) {
    if (array[i-gap]>array[i]) {
        temp = array[i];
        array[i] = array[i-gap];
        array[i-gap] = temp;
    }
}

需要:(这是插入排序变体)

for (i=gap; i<SIZE; i++) {
    int j;
    temp = a[i];
    for (j=i; j >= gap && a[j-gap] > temp; j-=gap)
        a[j] = a[j-gap];
    a[j] = temp;
}

您也可以制作冒泡排序变体。但是你肯定需要第二个for循环而不是你现在拥有的循环。