古いアルゴリズムのコースを更新するためにいくつかの練習問題を行っており、クイックソートを実装しようとしています。はい、製品コードで使用する必要があることはわかっていますstd::sort
が、これは教育目的のためです:)
以下のコードがあります。配列内のすべての要素が一意である場合は機能しますが、要素が重複している場合は機能しません。どうして?私はどこでつまずいたのですか?
void quicksort(int arr[], int left, int right)
{
// base case:
if (left >= right)
return;
// alternative case:
int pivot_index = (left + right)/2;
int pivot = arr[pivot_index];
int i = left, j = right;
int tmp;
while (i < j)
{
// scan from left until elem > pivot or left == right,
while (arr[i] < pivot)
++i;
// scan from right until elem < pivot or right == left.
while (arr[j] > pivot)
--j;
if (i < j)
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
++i;
--j;
}
}
// recurse on left and right.
if (i > left)
quicksort(arr, left, i);
if (i < right)
quicksort(arr, i + 1, right);
}
void main()
{
const int arr_size = 7;
int arr[arr_size] = {1,2,4,3,9,5,2};
quicksort(arr, 0, arr_size - 1);
for (int i = 0; i < arr_size; ++i)
{
std::cout << arr[i] << ", ";
}
}