2017-09-22 14 views
-3

私はSplashキットライブラリを使用しています。クイックソートを実装する方法は?

#include "splashkit.h" 

#define NUM_VALS 100 
//drawing 100 random values in chart 
void draw_values(const int values[], int size) 
{ 
    int x = 0; 
    int y; 
    int rect_height; 
    int rect_width = screen_width()/size; 

    for (int i = 0; i < size; i++) 
    { 
     rect_height = values[i]; 
     y = screen_height() - rect_height; 

     fill_rectangle(COLOR_RED, x, y, rect_width, rect_height); 
     draw_rectangle(COLOR_WHITE, x, y, rect_width, rect_height); 

     x += rect_width; 
    } 
} 
//swap procedure 
void swap (int &value1, int &value2) 
{ 
    int temp = value1; 
    value1 = value2; 
    value2 = temp; 
} 
//draw array values window 
void draw_sort(int values[], int size) 
{ 
    clear_screen(COLOR_WHITE); 
    draw_values(values, size); 
    refresh_screen(60); 
} 
//bubble sort code using above procedures 
void bubble_sort (int values[], int size) 
{ 
    for (int j =0; j < size; j++) 
    { 
     for (int i =0; i < size - 1; i++) 
     { 
      if (values[i] > values[i + 1]) 
      { 
       swap(values[i], values[i + 1]); 
       draw_sort(values, size); 
      } 
     } 
    } 
} 
// i think something wrong in this function only 
void quick_sort(int values[], int size) { 
     int i = values[size + 1] , j = values[size - 1] ; 
     int tmp; 
     int pivot = values[(i + j)/2]; 

     /* partition */ 
     while (i <= j) { 
      while (values[i] < pivot) 
        i++; 
      while (values[j] > pivot) 
        j--; 
      if (i <= j) { 
        tmp = values[i]; 
        values[i] = values[j]; 
        values[j] = tmp; 
        i++; 
        j--; 
      } 
     }; 

     /* recursion */ 
     if (i < j) 
      quick_sort(values, i); 
     if (i < j) 
      quick_sort(values, j); 
} 
// randomising array values to sort 
void random_fill_array(int values[], int size) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     values[i] = rnd(screen_height()) + 1; 
    } 
} 
//to test each sort 
void handle_input(int values[], int size) 
{ 
    if (key_typed(R_KEY)) 
    { 
     random_fill_array(values, size); 
    } 
    else if (key_typed(S_KEY)) 
    { 
     bubble_sort(values, size); 
    } 
    else if (key_typed(D_KEY)) 
    { 
     quick_sort(values, size); 
    } 
} 

int main() 
{ 
    int values[NUM_VALS]; 

    open_window("Sort Visualiser", 800, 600); 

    random_fill_array(values, NUM_VALS); 

    while (not quit_requested()) 
    { 
     process_events(); 
     handle_input(values, NUM_VALS); 

     draw_sort(values, NUM_VALS); 
    } 

    return 0; 
} 

私は以前の問題を克服しましたが、今は新たな問題が発生しました。私の任務ではありません。私はちょうどすべての種類を知るようになっています。どこが間違っているのか教えてください。

"S"を押してもバブルが発生する>ソートが分かりますが、 "D"を押すとアプリケーションがクラッシュしてしまいます。

+0

どちらの場合もまったく同じです 'Partition'は'二つの引数 'パーティション(int型の値[]、int型のサイズ)を持って、あなたが呼んでいますそれは3: 'パーティション(値、低、高)'である。それは "あまりにも多くの議論"が意味するものではありませんか? – Barmar

+0

'Partition'関数の中では初期化されていない変数' low'と 'high'を使います。引数' size'は決して使用しません。たぶんそれはパラメータとしてそれらをローカル変数として宣言しないでください? – Barmar

+1

'swap(&values [high]、&values [pvt]);'は値の代わりに値へのポインタを入れ替えます。なぜ 'std :: swap'を使わないのでしょうか?また、ランダム呼び出しは 'pindex'に極値を持たせることができ、' pindex-1'や 'pindex + 1'を範囲外にして再帰呼び出しを行うことができます。 –

答えて

1

これは本当に疑わしい:

/* recursion */ 
if (i < j) 
     quick_sort(values, i); 
if (i < j) 
     quick_sort(values, j); 

条件が

関連する問題