快速排序
快速排序是建立在冒泡排序基础上的一种排序方法
基本思想 :通过一趟排序将要排序的数据分割成独立的两部分
其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,
整个排序过程可以递归进行,以此达到整个数据变成有序序列。
实现方法:
1.选择一个基准元素,通常选择第一个元素或者最后一个元素。
2.比较排序,将小于基准元素的数据移到左边,大于基准元素的数据移到右边。
3.再次对左右两边的数据进行排序。
4.重复步骤2和3,直到整个数据变成有序序列。
通关代码
int partition_array(int *arr, int l, int r)
// 编程实现arr[l, r]分区:选定一个基准,左边比基准小,右边比基准大
// 返回基准所处位置
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
// 基准元素
int pivot = arr[l];
// 左右两边的指针
int i = l + 1;
int j = r;
// 将arr[l+1, r]分为两部分,左边比pivot小,右边比pivot大
while (i <= j)
{
// 左边找到一个比pivot大的元素
while (i <= r && arr[i] <= pivot)
{
i++;
}
// 右边找到一个比pivot小的元素
while (j >= l + 1 && arr[j] >= pivot)
{
j--;
}
// 如果左边比pivot大,右边比pivot小,交换两个元素
if (i < j)
{
swap(arr[i], arr[j]);
}
}
// 将pivot放到正确的位置
swap(arr[l], arr[j]);
// 返回pivot所处位置
return j;
/********** End **********/
}
int *quick_sort(int *arr, int l, int r)
// 基于partition_array函数编程实现快速排序:自上而下的递归方法
// 函数参数:有序数组arr 初始l=0,r=n-1
// 函数返回值:返回从小到大排序后的数组
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (l >= r)
{
return arr;
}
// 分区
int pivot = partition_array(arr, l, r);
// 左边排序
quick_sort(arr, l, pivot - 1);
// 右边排序
quick_sort(arr, pivot + 1, r);
return arr;
/********** End **********/
}
完整代码
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
void print_array(int *arr, int n);
// 打印数组
int partition_array(int *arr, int l, int r);
// arr[l, r]分区:选定一个基准,左边比基准小,右边比基准大
// 返回基准所处位置
int *quick_sort(int *arr, int l, int r);
// 快速排序:自上而下的递归方法,初始l=0,r=n-1
void print_array(int *arr, int n)
// 打印数组
{
if (n == 0)
{
printf("ERROR: Array length is ZERO\n");
return;
}
printf("%d", arr[0]);
for (int i = 1; i < n; i++)
{
printf(" %d", arr[i]);
}
printf("\n");
}
int partition_array(int *arr, int l, int r)
// 编程实现arr[l, r]分区:选定一个基准,左边比基准小,右边比基准大
// 返回基准所处位置
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
// 基准元素
int pivot = arr[l];
// 左右两边的指针
int i = l + 1;
int j = r;
// 将arr[l+1, r]分为两部分,左边比pivot小,右边比pivot大
while (i <= j)
{
// 左边找到一个比pivot大的元素
while (i <= r && arr[i] <= pivot)
{
i++;
}
// 右边找到一个比pivot小的元素
while (j >= l + 1 && arr[j] >= pivot)
{
j--;
}
// 如果左边比pivot大,右边比pivot小,交换两个元素
if (i < j)
{
swap(arr[i], arr[j]);
}
}
// 将pivot放到正确的位置
swap(arr[l], arr[j]);
// 返回pivot所处位置
return j;
/********** End **********/
}
int *quick_sort(int *arr, int l, int r)
// 基于partition_array函数编程实现快速排序:自上而下的递归方法
// 函数参数:有序数组arr 初始l=0,r=n-1
// 函数返回值:返回从小到大排序后的数组
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if (l >= r)
{
return arr;
}
// 分区
int pivot = partition_array(arr, l, r);
// 左边排序
quick_sort(arr, l, pivot - 1);
// 右边排序
quick_sort(arr, pivot + 1, r);
return arr;
/********** End **********/
}
int main(int argc, const char *argv[])
{
int n;
scanf("%d", &n);
int *arr;
arr = (int *)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
arr = quick_sort(arr, 0, n - 1);
print_array(arr, n);
return 0;
}