2017-07-25 210 views
0

我想編寫一個快速排序程序在c中,我的遞歸函數是在一個無限循環。語言C - 快速排序

的問題是:

您已被給定的陣列大小的 甲 N.This數組包含整數範圍從 1至 10^9。你需要按照它們的值對這個數組的內容進行排序,然後打印它的內容。

輸入格式:

第一行包含一個單一的整數N,表示該數組的大小。下一行包含N個空格分隔的整數,表示數組的內容。

輸出格式:

打印傳單N空間分隔的整數,即,最終排序陣列。

約束:

1≤N≤10^ 6

1≤A[I]≤10^ 9

void fill_vet(unsigned int a[], unsigned int n){ 
    int i; 
    for(i=0; i<n; i++) 
     scanf("%u", &a[i]); 
} 

void print_vet(unsigned int a[], unsigned int n){ 
    int i; 
    for(i=0; i<n; i++) 
     printf("%u ", a[i]); 
} 

int partition(unsigned int a[], int start, int end){ 
    int i, j; 
    unsigned int pivot, n_swap; 
    i = start + 1; 
    pivot = a[start]; 
    for(j = start+1; j<=end; j++){ 
     if(a[j] < pivot){ 
      n_swap = a[j]; 
      a[j] = a[i]; 
      a[i] = n_swap; 
      i++; 
     } 
    } 
    n_swap = a[i-1]; 
    a[i-1] = a[start]; 
    a[start] = n_swap; 
    return i-1; 
} 

void sort_array(unsigned int a[], int start, int end){ 
    while(start < end){ 
     int pos_piv = partition(a, start, end); 
     sort_array(a, start, pos_piv-1); 
     sort_array(a, pos_piv+1, end); 
    } 
} 

int main() 
{ 
    unsigned int n, a[100000]; 
    scanf("%u", &n); 
    fill_vet(a, n); 
    sort_array(a, 0, n-1); 
    print_vet(a, n); 
    return 0; 
} 

你能告訴我哪裏是錯誤請!

+2

起點和終點永遠不會改變,一旦在 –

+2

而傳遞應該是「如果」 –

+1

BTW'10^6'是'1000000' ,而不是'100000' – BLUEPIXY

回答

2

您正在使用遞歸,所以你並不需要一個循環:

void sort_array(unsigned int a[], int start, int end){ 
    if(start < end){ 
    int pos_piv = partition(a, start, end); 
    sort_array(a, start, pos_piv-1); 
    sort_array(a, pos_piv+1, end); 
    } 
}