个人总结的两种写法,比较倾向于partition1, 一个边界毕竟比两个边界好控制。此处代码基于C++, 其实也就是用了个vector而已,随便改改其他语言都可以。partition3, 非常精简的写法。
#include "stdafx.h"
#include "iostream"
#include <vector>
using namespace std;
int main()
{
vector<int>& quicksort(vector<int>& nums, int begin, int end);
void printArray(vector<int>& nums, int size);
vector<int> arr = { 7 };
vector<int> &nums = arr;
int n = nums.size();
nums = quicksort(nums, 0, n - 1);
cout << "Sorted array: \n" << endl;
printArray(nums, n);
return 0;
}
void printArray(vector<int>& nums, int size)
{
int i;
for (i = 0; i < size; i++)
cout << nums[i] << " " << endl;
printf("\n");
}
void swap(vector<int>& nums, int a, int b) {
int temp;
temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
int partition1(vector<int>& nums, int begin, int end) {
int pivot = nums[end];
int i = begin; // index of bigger element
int j = begin; // index of scanning point
while (j <= (end - 1)) {
if (nums[j] <= pivot) {
swap(nums, i, j);
i++;
}
j++;
}
swap(nums, i, end);
return i;
}
int partition2(vector<int>& nums, int begin, int end) {
int pivot = nums[end];
int i = begin; // index of smaller element
int j = end-1; // index of bigger element
while (true) {
while (nums[i] < pivot && i <= j) {
i++;
}
while (nums[j] >= pivot && j > i) {
j--;
}
if (i >= j) {
break;
}
swap(nums, i, j);
}
swap(nums, i, end);
return i;
}
int Partition3(vector<int>& nums, int begin, int end)
{
for (int i = begin; i <= end; swap(nums[begin++], nums[i++]))
while (nums[i] > nums[end]) i++;
return begin - 1;
}
vector<int>& quicksort(vector<int>& nums, int begin, int end) {
if (begin < end)
{
int middle = partition2(nums, begin, end);
if ((middle - 1)>=begin) quicksort(nums, begin, middle - 1);
if ((middle + 1)<=end) quicksort(nums, middle + 1, end);
}
return nums;
}