标签:最坏情况 最好 partition 需要 oid sort 复杂 otp std
下面是快速排序的一些特征:
快速排序的一次划分会将一个元素放到排好序的最终位置上
下面是快速排序的代码:
/**
* arr 为需要排序的数组名
* low 为起始元素下标
* high 为末尾元素下标
*/
void quick_sort(int arr[], int low, int high)
{
if (low < high) {
int pivotPos = partitionf(arr, low, high); // 将一组数划分为两组
quick_sort(arr, low, pivotPos-1);
quick_sort(arr, pivotPos+1, high);
}
}
/**
* 划分函数,执行一次,将一个元素放到最终位置
* 并返回这个元素的索引,作为划分的位置
*/
int partitionf(int arr[], int low, int high)
{
int pivot = arr[low];
while (low < high) {
while (low<high && arr[high]>=pivot) --high;
arr[low] = arr[high];
while (low<high && arr[low]<=pivot) ++low;
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
}
测试代码,可直接复制后编译执行:
#include <stdio.h>
void quick_sort(int *, int, int);
int partitionf(int *, int, int);
void show(int *, int);
int main()
{
int n = 4;
int arr[] = {7, 10, 11, 9};
quick_sort(arr, 0, n-1);
show(arr, n);
return 0;
}
/**
* arr 为需要排序的数组名
* low 为起始元素下标
* high 为末尾元素下标
*/
void quick_sort(int arr[], int low, int high)
{
if (low < high) {
int pivotPos = partitionf(arr, low, high); // 将一组数划分为两组
quick_sort(arr, low, pivotPos-1);
quick_sort(arr, pivotPos+1, high);
}
}
/**
* 划分函数,执行一次,将一个元素放到最终位置
* 并返回这个元素的索引,作为划分的位置
*/
int partitionf(int arr[], int low, int high)
{
int pivot = arr[low];
while (low < high) {
while (low<high && arr[high]>=pivot) --high;
arr[low] = arr[high];
while (low<high && arr[low]<=pivot) ++low;
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
}
void show(int arr[], int len)
{
int i;
for (i=0; i<len; i++) {
printf("%4d", arr[i]);
}
printf("\n");
}
标签:最坏情况 最好 partition 需要 oid sort 复杂 otp std
原文地址:https://www.cnblogs.com/qijinzhi/p/quick_sort.html