2016-01-26 238 views
-3

當我運行我的QuickSort代碼,並輸入數字。 根本沒有輸出。 我不知道這個問題。[QuickSort]遞歸問題

這裏是我的代碼:

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

void quickSort(int *pA, int left, int right) { 
    int i, j, t, temp; 
    temp = pA[left]; 
    i = left; 
    j = right; 
    while (i != j) { 
     while (i < j && pA[j] >= temp) 
      j--; 
     while (i < j && pA[i] <= temp) 
      i++; 
     if (i < j) { 
      t = pA[i]; 
      pA[i] = pA[j]; 
      pA[j] = t; 
     } 
    } 
    pA[left] = pA[i]; 
    pA[i] = temp; 
    quickSort(pA, left, i - 1); 
    quickSort(pA, i + 1, right); 
} 

int main() { 
    int i, n, a[100]; 
    printf("please input the total of numbers:"); 
    scanf("%d", &n); 
    for (i = 0; i < n; i++) { 
     printf("number %d is:", i + 1); 
     scanf("%d", &a[i]); 
    } 
    quickSort(&a, 0, n - 1); 
    for (i = 0; i < n; i++) { 
     printf("%d ", a[i]); 
    } 
    return 0; 
} 

接下來是代碼運行畫面: enter image description here

+1

所以你調用'快速排序()''內快速排序()'?你如何期待這個循環結束? – Flikk

+2

單擊'while(i!= j)左邊的灰色區域'出現紅點;它被稱爲「斷點」。按F5運行您的代碼。一旦到達紅點線,程序將暫停,並等待你的行動。按F10進入下一行。如果光標正在進行函數調用,請按F11進入該函數。要了解更多這類技巧,請在您最喜愛的搜索引擎中搜索「VS調試」。 – dasblinkenlight

+1

你需要一個停止條件。如果slice的大小小於2,則應該返回'quickSort'而不對其自身進行任何新的調用。 –

回答

0

您必須在遞歸quickSort添加一個測試它停止遞歸!例如,只有1個條目的片段顯然是排序的。

這裏是一個修正版本:

#include <stdio.h> 

void quickSort(int *pA, int left, int right) { 
    int i, j, t, temp; 
    if (right - left < 1) 
     return; 
    temp = pA[left]; 
    i = left; 
    j = right; 
    while (i != j) { 
     while (i < j && pA[j] >= temp) 
      j--; 
     while (i < j && pA[i] <= temp) 
      i++; 
     if (i < j) { 
      t = pA[i]; 
      pA[i] = pA[j]; 
      pA[j] = t; 
     } 
    } 
    pA[left] = pA[i]; 
    pA[i] = temp; 
    quickSort(pA, left, i - 1); 
    quickSort(pA, i + 1, right); 
} 

int main(void) { 
    int i, n, a[100]; 
    printf("please input the total of numbers: "); 
    scanf("%d", &n); 
    for (i = 0; i < n; i++) { 
     printf("number %d is: ", i + 1); 
     scanf("%d", &a[i]); 
    } 
    quickSort(a, 0, n - 1); 
    for (i = 0; i < n; i++) { 
     printf("%d ", a[i]); 
    } 
    printf("\n"); 
    return 0; 
}