diff --git a/README.md b/README.md index 609888d..6c5bb55 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ 構造体とポインタについての学習 +2022/04/09 + #### 処理内容 1. 生徒配列を定義する @@ -12,6 +14,24 @@ 3. ランダムに点数を生成する 4. 科目ごとの平均点、最大点、最低点を標準出力する +### クイックソート + +数値配列のクイックソートを行う + +2022/04/22 + +#### 処理内容 + +1. 配列と、左端(0)、右端(配列の長さ)を渡す +2. 左端が右端以上であるならピボットを取得する +3. ピボット(左端)のデータより小さければiをすすめる +4. ピボットのデータより大きければjを戻す +5. 中央値まで求めたらそのデータを比較し、入れ替える +6. i が j 以下であればループを行う +7. ピボットとjを入れ替える +8. ピボットより小さいデータをクイックソートする +9. ピボットより大きいデータをクイックソートする + # Copyright Copyright (c) 2022 kema All Rights Reserved. diff --git a/quick_sort/q_sort.c b/quick_sort/q_sort.c new file mode 100644 index 0000000..66c4417 --- /dev/null +++ b/quick_sort/q_sort.c @@ -0,0 +1,117 @@ +#include +#include +#include + +/*********************************** +XとYを入れ替える +***********************************/ +int +swap( +int *x, +int *y +) +{ + int temp; + + temp = *x; + *x = *y; + *y = temp; + + return 0; +} + +/*********************************** +中央値(Pivot)を求め、入れ替える +***********************************/ +int +get_pivot( +int array[], +int left, +int right +) +{ + int i; + int j; + int pivot; + + i = left; + j = right + 1; + pivot = left; + + do + { + do + { + i++; + } while ( array[i] < array[pivot] ); + + do { + j--; + } while ( array[pivot] < array[j] ); + + if ( i < j ) + { + swap(&array[i], &array[j]); + } + } while (i < j); + + swap(&array[pivot], &array[j]); + + return j; +} + +/*********************************** +クイックソートを行う +***********************************/ +int +q_sort( +int array[], +int left, +int right +) +{ + int pivot; + + if ( left < right ) + { + pivot = get_pivot(array, left, right); + q_sort(array, left, pivot - 1); + q_sort(array, pivot + 1, right); + } + + return 0; +} + +/*********************************** +メイン関数 +***********************************/ +int +main() +{ + int array[] = { + 10, 20, 30, 50, + 50, 10, 45, 65, + 76, 54, 56, 15, + 34, 31, 14, 17, + 14, 15, 11, 16, + 90, 19, 98, 76, + 75, 15, 161, 165, + 166, 167, 87, 86 + }; + + int length = sizeof(array) / sizeof(int); + + printf("Length: %d\n", length); + q_sort(array, 0, length); + + int i ; + + for ( i = 0 ; i < length ; i++ ) + { + printf("%d", array[i]); + printf("\n"); + } + + return 0; +} + diff --git a/quick_sort/qsort b/quick_sort/qsort new file mode 100755 index 0000000..a2b74ff Binary files /dev/null and b/quick_sort/qsort differ