我不是排序方面的专家,但根据我的理解,以下程序应该有效。不幸的是,它并不总是奏效。你能帮我弄清楚它有什么问题吗?谢谢。以下是代码:
/*
* 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;
}
答案 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
循环而不是你现在拥有的循环。