快速排序
步骤:
找到一个基元素,将它放置在合适的位置,使该元素一侧全为大于等于它的元素,另一侧全为小于它的元素;
再将该元素的左侧和右侧分别进行上述操作;
再一直重复上述操作直至排序完成。
递归实现
这里写一种方法的代码
void swap(int* arr, int p1, int p2)
{
int tmp = arr[p1];
arr[p1] = arr[p2];
arr[p2] = tmp;
}
void QuickSort(int* arr, int begin, int end)
{
if (end <= begin)
{
return;
}
int prev = begin;
int cur = begin+1;
//prev和cur之间是大于等于基元素的元素
//prev位置是小于基元素的元素(刚开始等于基元素)
while (cur <= end)
{
if (arr[cur] < arr[begin])
{
swap(arr, ++prev, cur);
}
++cur;
}
swap(arr, begin, prev);
QuickSort(arr, begin, prev - 1);
QuickSort(arr, prev + 1, end);
}
void main()
{
int arr[] = { 3,15,4,23,64,1,5,3,1,654,12 };
QuickSort(arr, 0, sizeof(arr) / 4 - 1);
}
迭代实现
若要用循环实现,关键就在于要创建一个队列去存储数据(每一次处理时的begin和end)。
void QuickSort(int* arr, int begin, int end)
{
Queue q;
QueueInit(&q);
//创建并初始化队列
QueuePush(&q, begin);
QueuePush(&q, end);
//存入第一次处理的begin和end
while (!QueueEmpty(&q))//当栈为空时结束
{
int begin1 = QueueFront(&q);
QueuePop(&q);
int end1 = QueueFront(&q);
QueuePop(&q);
//取出要处理的数据
if (begin1 >= end1)
{
continue;
}
int prev = begin1;
int cur = begin1+1;
while (cur <= end1)
{
if (arr[cur] < arr[begin1])
{
swap(arr, ++prev, cur);
}
++cur;
}
swap(arr, begin1, prev);
//进行一次排序
QueuePush(&q,begin1);
QueuePush(&q,cur-1);
QueuePush(&q,cur+1);
QueuePush(&q,end1);
//将之后要处理的数据存储进去
}
}