-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"を押すとアプリケーションがクラッシュしてしまいます。
どちらの場合もまったく同じです 'Partition'は'二つの引数 'パーティション(int型の値[]、int型のサイズ)を持って、あなたが呼んでいますそれは3: 'パーティション(値、低、高)'である。それは "あまりにも多くの議論"が意味するものではありませんか? – Barmar
'Partition'関数の中では初期化されていない変数' low'と 'high'を使います。引数' size'は決して使用しません。たぶんそれはパラメータとしてそれらをローカル変数として宣言しないでください? – Barmar
'swap(&values [high]、&values [pvt]);'は値の代わりに値へのポインタを入れ替えます。なぜ 'std :: swap'を使わないのでしょうか?また、ランダム呼び出しは 'pindex'に極値を持たせることができ、' pindex-1'や 'pindex + 1'を範囲外にして再帰呼び出しを行うことができます。 –