C
1#include <stdio.h> 2#define SIZE 6 3 4 5void quick_sort(int[], int, int); 6 7int main() 8{ 9 int array[SIZE] = {3, 2, 6, 1, 5, 4}; 10 int i; 11 12 printf("Before sort: "); 13 for (i = 0; i < SIZE; i++) { 14 printf("%d ", array[i]); 15 } 16 printf("\n"); 17 18 quick_sort(array, 0, 5); 19 20 printf("After sort: "); 21 for (i = 0; i < SIZE; i++) { 22 printf("%d ", array[i]); 23 } 24 printf("\n"); 25 return 0; 26} 27 28//値を入れ替える関数 29void swap(int *x, int *y) { 30 int temp; 31 temp = *x; 32 *x = *y; 33 *y = temp; 34} 35 36/*** 37 * pivotを決め、 38 * 全データをpivotを境目に振り分け、 39 * pivotの添え字を返す 40 ***/ 41int partition(int array[], int left, int right) { 42 int i, j, pivot; 43 44 i = left; 45 j = right + 1; 46 //先頭要素をpivotとする 47 pivot = left; 48 49 do { 50 do {i++; } while (array[pivot] > array[i]); 51 do {j--; } while (array[pivot] < array[j]); 52 //pivotより小さいものを左へ、大きいものを右へ 53 if (i < j) { 54 swap(&array[i], &array[j]); 55 } 56 } while (i < j); 57 swap(&array[pivot], &array[j]); 58 //pivotを更新 59 return j; 60} 61 62////クイックソート 63void quick_sort(int array[], int left, int right) { 64 int pivot; 65 if (left < right) { 66 pivot = partition(array, left, right); 67 quick_sort(array, left, pivot-1); 68 //pivotを境に再帰的にクイックソート 69 quick_sort(array, pivot+1, right); 70 } 71} 72
C
1実行結果: Before sort: 3 2 6 1 5 4 2 After sort: 1 2 3 4 5 6
①クイックソート関数の
if (left < right) という部分の意図がわかりません。
なぜ、このような条件をつけているのでしょうか?なくてもいいような気がします。
②クイックソート関数の
quick_sort(array, left, pivot-1);
quick_sort(array, pivot+1, right);
なぜ2回も再帰を行なっているのでしょうか?
それと、引数が2つとも違うのはなぜなんでしょうか?
前半と後半をソートすればすべてソートできるというのがクイックソートのアルゴリズムの基本です。
だから半分に分けて二回ソートします。
left < right は継続条件です。
left >= right になったら終了です。
まずは、「クイックソートとは何なのか?」を理解しましょう。
https://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88
回答1件
あなたの回答
tips
プレビュー