目录
一. 快排介绍
快速排序(Quick Sort)是一种常用的排序算法,效率较高。它的基本思想是选择一个基准元素,将待排序序列分成两个子序列,其中一个子序列的所有元素都比基准元素小,另一个子序列的所有元素都比基准元素大,然后对这两个子序列分别进行递归调用快速排序。快速排序的时间复杂度为O(nlogn),是一种效率较高的排序算法。
二. 快排实现
2.1.1 单趟动画排序
2.1.2 单趟排序
默认基准元素定为最左边元素 i和j分别从两端开始向中间移动 当i停在比基准元素小的元素和j停在比基准元素大的元素时 交换两端的值 最后再将新的基准值返回 这一趟便完成了
int partition(int nums[], int left, int right) {
// 以 nums[left] 为基准数
int i = left, j = right;
while (i < j) {
while (i < j && nums[j] >= nums[left]) {
// 从右向左找首个小于基准数的元素
j--;
}
while (i < j && nums[i] <= nums[left]) {
// 从左向右找首个大于基准数的元素
i++;
}
// 交换这两个元素
swap(nums, i, j);
}
// 将基准数交换至两子数组的分界线
swap(nums, i, left);
// 返回基准数的索引
return i;
}
2.2 多趟排序
总的就是在单趟排序的基础上 将基准值左右两边的 数组再次进行相同的单趟排序排序
void qsort(int nums[], int left, int right) {
// 子数组长度为 1 时终止递归
if (left < right) {
// 哨兵划分
int pivot = partition(nums, left, right);
// 递归左子数组、右子数组
qsort(nums, left, pivot - 1);//根据基准换分的左右数组进行递归来排序
qsort(nums, pivot + 1, right);
}
}
三. 整体代码
#include<stdio.h>
void swap(int nums[], int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
/* 快速排序类 */
// 快速排序类-哨兵划分
int partition(int nums[], int left, int right) {
// 以 nums[left] 为基准数
int i = left, j = right;
while (i < j) {
while (i < j && nums[j] >= nums[left]) {
// 从右向左找首个小于基准数的元素
j--;
}
while (i < j && nums[i] <= nums[left]) {
// 从左向右找首个大于基准数的元素
i++;
}
// 交换这两个元素
swap(nums, i, j);
}
// 将基准数交换至两子数组的分界线
swap(nums, i, left);
// 返回基准数的索引
return i;
}
// 快速排序类-快速排序
void qsort(int nums[], int left, int right) {
// 子数组长度为 1 时终止递归
if (left < right) {
// 哨兵划分
int pivot = partition(nums, left, right);
// 递归左子数组、右子数组
qsort(nums, left, pivot - 1);
qsort(nums, pivot + 1, right);
}
}
int main(){
int a[]={6,2,4,3,3,1},n=6;
int z=0,y=5;
qsort(a,z,y);
for(int i=0;i<n;i++)
printf("%d",a[i]);
}
运行后
| |
\/