2012-11-12 88 views
0

我的計數排序有問題。當我將表排序有時它工作,但有時沒有(當k ==大小時它不工作),我不知道爲什麼。請幫忙。這是我的代碼:計數排序C

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 
#define MAX 100000 
int tabA[MAX]; 
int tabB[MAX]; 
int tabC[MAX]; 
int k; 

void scope(int size){ 
int i, max = 0, min; 

min = tabA[1]; 

    for(i = 1; i <= size; i++){ 
     if(tabA[i] > max) 
      max = tabA[i]; 
     if(tabA[i] < min) 
      min = tabA[i]; 
    } 

    k = max - min + 1; 
} 

void rand1(int size){ 
    int i; 
    srand(time(NULL)); 

    for(i = 0; i <= size; i++) 
     tabA[i] = rand() % 8; 
} 

void countingsort(int size){ 
    int i; 

    for(i = 0; i < k; i++) 
     tabC[i] = 0; 

    for(i = 0; i < size; i++) 
     tabC[tabA[i + 1]] = tabC[tabA[i + 1]] + 1; 

    for(i = 1; i <= k; i++) 
     tabC[i] = tabC[i] + tabC[i - 1]; 

    for(i = size; i >= 1; i--){ 
     tabB[tabC[tabA[i]]] = tabA[i]; 
     tabC[tabA[i]] = tabC[tabA[i]] - 1; 
    } 
} 

int main(void){ 
    int size, i; 

    printf("Please write how many numbers you wont to sort: "); 
    scanf("%d", &size); 

    rand1(size); 
    scope(size); 
    countingsort(size); 

    printf("Numbers to sort:\n"); 
    for(i = 1; i <= size; i++) 
     printf("%d\n", tabA[i]); 

    printf("\nK: %d\n\n", k); 

    printf("Sorting numbers:\n"); 
    for(i = 1; i <= size; i++) 
     printf("%d\n", tabB[i]); 

    return 0; 
} 

感謝所有的幫助。

+0

爲什麼你在countingsort中從1到k的循環中在'tabC'中累加數字。此外,爲什麼你的第一個循環從0到k獨佔,第二個從1到k?計數排序應該佔用4行。我認爲你過於複雜。 –

+0

因爲我有這樣的代碼: http://inf.ug.edu.pl/~gmadejsk/asd/img/countingsort.png – henio180

+0

我從來沒有看到這種計數排序的實現。仍然注意到最底部的循環超過'j',而用於數組元素的索引變量是'i' ...這段代碼對我來說似乎很陌生... –

回答

1

至少這個代碼:

for(i = 0; i < k; i++) 
    tabC[i] = 0; 

for(i = 0; i < size; i++) 
    tabC[tabA[i + 1]] = tabC[tabA[i + 1]] + 1; 

for(i = 1; i <= k; i++) 
    tabC[i] = tabC[i] + tabC[i - 1]; 

出現問題,在第一,intialization環i0..k-1,但在最後一個循環i去從1..k,同時假設tabC被初始化。此外,中間迴路假設範圍爲tabA,值爲0..k,它可能不是(看看隨機化函數,它實際上可能是,但這只是我認爲的同時發生)。

+0

好的謝謝 - 現在它正在工作;) – henio180