【题解】《算法零基础100讲》(第37讲) 排序进阶 - 快速排序

一. 快速排序

  快速排序的原理就是随机选取一个关键值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;
}

二. 推荐专栏

《算法零基础100讲》(第37讲) 排序进阶 - 快速排序

三. 相关练习

有序数组的平方

题目链接:

977. 有序数组的平方

这道题我们先将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;
}

Guess you like

Origin blog.csdn.net/qq_53060585/article/details/121582171