示意图如下:
下标0暂存i,不参与排序
代码如下:
#include<iostream>
//#include<string>
using namespace std;
int partition(int arr[], int begin_index, int end_index)
{
int key = arr[end_index];
int i = begin_index-1;
for (int j = begin_index; j <= end_index - 1; j++)
{
if (arr[j] <= key)
{
i = i + 1;
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
int T = arr[i + 1];
arr[i + 1] = arr[end_index];
arr[end_index] = T;
return i+1;
}
void quick_sort(int arr[], int begin_index, int end_index)
{
if (begin_index < end_index)
{
int midle = partition(arr, begin_index, end_index);
quick_sort(arr, begin_index, midle - 1);
quick_sort(arr, midle + 1, end_index);
}
}
void main()
{
int arr1[] = {0, 2, 3, 5, 1, 4, 11, 6, 4, 8, 7 };
const int arr_num = sizeof(arr1) / sizeof(int);
for (int i = 1; i <arr_num; i++)
cout << arr1[i] << " ";
cout << endl;
quick_sort(arr1, 1, arr_num-1);
for (int i = 1; i < sizeof(arr1) / sizeof(int); i++)
cout << arr1[i] << " ";
cout << endl;
system("pause");
}
随机化版本:
#include<iostream>
//#include<string>
using namespace std;
int partition(int arr[], int begin_index, int end_index)
{
int key = arr[end_index];
int i = begin_index-1;
for (int j = begin_index; j <= end_index - 1; j++)
{
if (arr[j] <= key)
{
i = i + 1;
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
int T = arr[i + 1];
arr[i + 1] = arr[end_index];
arr[end_index] = T;
return i+1;
}
int randomized_partition(int arr[], int begin_index, int end_index)
{
int k = begin_index + rand() % (end_index - begin_index + 1);
int t = arr[k];
arr[k] = arr[end_index];
arr[end_index] = t;
return partition(arr, begin_index, end_index);
}
void quick_sort(int arr[], int begin_index, int end_index)
{
if (begin_index < end_index)
{
int midle = randomized_partition(arr, begin_index, end_index);
quick_sort(arr, begin_index, midle - 1);
quick_sort(arr, midle + 1, end_index);
}
}
void main()
{
int arr1[] = {0, 2, 3, 5, 1, 4, 11, 6, 4, 8, 7 };
const int arr_num = sizeof(arr1) / sizeof(int);
for (int i = 1; i <arr_num; i++)
cout << arr1[i] << " ";
cout << endl;
quick_sort(arr1, 1, arr_num-1);
for (int i = 1; i < sizeof(arr1) / sizeof(int); i++)
cout << arr1[i] << " ";
cout << endl;
system("pause");
}