一. 快速排序
快速排序的原理就是随机选取一个关键值key,或者称为哨兵,每轮排序的结果都是将所有小于key的值放到左边,大于key的值在右边,然后再分别对两边的数据进行快排。
如图:
我们将上面的过程进行拆分,假设我们定义了一个数组nums[] = {3, 4, 9, 1, 3, 2, 5, 6};则有如下数据。
一般情况我们都是令第一个数据为key,然后用双指针left和right分别指向左右两端,然后用left找出大于key的值,用right找出小于key的值,将他们进行交换,当left == right时,第一次循环结束,将key值赋给nums[left]。
第一轮结束,小于3的都在左边,大于3的都在右边,然后我们分别对3两边的数组进行排序。
第二轮:
第三轮:
实际上现在已经排好了
代码如下:
#include <stdio.h>
void swap(int* a, int* b){
int tmp = *a;
*a = *b;
*b = tmp;
}
void QuickSort(int* nums, int begin, int end){
if(begin > end)return;
int key = nums[begin];
int l = begin;
int r = end;
while(l != r){
while(nums[r] >= key && r > l){
r--;
}
while(nums[l] <= key && r > l){
l++;
}
if(l < r){
swap(nums + l, nums + r);
}
}
nums[begin] = nums[l];
nums[l] = key;
QuickSort(nums, begin, l - 1);
QuickSort(nums, l + 1, end);
}
int main(){
int arr[] = {3, 4, 9, 1, 3, 2, 5, 6};
int arrSize = sizeof(arr) / sizeof(arr[0]);
QuickSort(arr, 0, arrSize - 1);
for(int i = 0; i < arrSize; i++){
printf("%d ", arr[i]);
}
return 0;
}
二. 推荐专栏
三. 相关练习
有序数组的平方
题目链接:
这道题我们先将nums中的每个数都平方一下,然后直接用快速排序即可。
代码如下:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void swap(int* a, int* b){
int tmp = *a;
*a = *b;*b = tmp;
}
void QuickSort(int* nums, int begin, int end){
if(begin > end)return ;
int key = nums[begin];
int l = begin;
int r = end;
while(l != r){
while(nums[r] >= key && l < r){
r--;
}
while(nums[l] <= key && l < r){
l++;
}
if(l < r){
swap(nums + l, nums + r);
}
}
nums[begin] = nums[l];
nums[l] = key;
QuickSort(nums, begin, l - 1);
QuickSort(nums, l + 1, end);
}
int* sortedSquares(int* nums, int numsSize, int* returnSize){
for(int i = 0; i < numsSize; i++){
nums[i] *= nums[i];
}
*returnSize = numsSize;
QuickSort(nums, 0, numsSize - 1);
return nums;
}