快速排序的基本思想,C和Python具体代码实现

本文介绍了一种高效的排序算法——快速排序的基本思想及实现方法,并提供了C语言和Python语言的实现代码。快速排序是一种交换排序,其核心是通过选择枢轴进行划分,递归地对子表进行排序。
部署运行你感兴趣的模型镜像

快速排序

  • 一种交换排序
    在这里插入图片描述

  • 基本思想

首先,在待排序表L[1…n]中任取一个元素(通常取首元素)作为枢轴,记作pivot;

通过一趟排序将L分成两部分L[1…k-1]和L[k+1…n],其中L[1…k-1]的元素都小于pivot,L[k+1…n]都大于pivot,pivot放在了最终位置,这个过程称为一次划分;

然后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止。

  • 详细代码

C语言:

#include<stdio.h>

void QuickSort(int  *A,int low,int high){
	if(low<high){
		int i=low;
		int j=high;
		int k=A[low];
		while(i<j){
			while(i<j&&A[j]>=k)	--j;	
			A[i]=A[j];	//将右边比枢轴小的元素移动到左边
			while(i<j&&A[i]<=k)	++i;
			A[j]=A[i];	//将左边比枢轴大的元素移动到右边
		}
		
		A[i]=k;
		
		// 递归调用
        QuickSort(A, low, i - 1);     // 排序k左边
        QuickSort(A, i + 1, high);    // 排序k右边
	}	
}

int main(){
	int A[5]={1,4,2,9,7};
	QuickSort(A,0,4);
	for(int i=0;i<5;i++)	printf("%d ",A[i]);
}
// Prints "1 2 4 7 9"

Python语言:

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]	#取整
    left = [x for x in arr if x < pivot]	#比pivot小的元素放在左边
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)

print(quicksort([3,6,8,10,1,2,1]))
# Prints "[1, 1, 2, 3, 6, 8, 10]"
  • 空间复杂度

递归操作需要借助一个递归工作栈

最好情况下,空间复杂度=递归层数=二叉树的高度=log2{log_2}log2n(左子树等于右子树)

最坏情况下,空间复杂度=递归层数=二叉树的高度=n

平均情况下,空间复杂度=递归层数=二叉树的高度=log2{log_2}log2n

  • 时间复杂度

时间复杂度=O(n×递归层数)

最好O(nlog2{log_2}log2n),最坏O(n2{n^2}n2)

当排列表有序时递归层数为n,此时快速排序最慢

  • 快速排序为不稳定的排序

不稳定因为存在交换。{3,2,2},经过快排后变成{2,2,3},2的相对位置发生了变化

  • 快速排序是最优秀的内部排序

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

好的,我来为您分别用C语言Python语言实现快速排序算法。 C语言实现: ```c #include <stdio.h> // 快速排序函数 void quickSort(int arr[], int low, int high) { if (low < high) { // pi 是分区后的基准元素的索引 int pi = partition(arr, low, high); // 递归地对基准元素左侧的子数组进行排序 quickSort(arr, low, pi - 1); // 递归地对基准元素右侧的子数组进行排序 quickSort(arr, pi + 1, high); } } // 分区函数 int partition(int arr[], int low, int high) { // 选择最右边的元素作为基准 int pivot = arr[high]; int i = (low - 1); // 小元素的索引 for (int j = low; j <= high - 1; j++) { // 如果当前元素小于或等于基准 if (arr[j] <= pivot) { i++; // 增加小元素的索引 int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i + 1]; arr[i + 1] = arr[high]; arr[high] = temp; return (i + 1); } // 打印数组的函数 void printArray(int arr[], int size) { for (int i = 0; i < size; i++) printf("%d ", arr[i]); printf("\n"); } // 主函数 int main() { int arr[] = {10, 7, 8, 9, 1, 5}; int n = sizeof(arr) / sizeof(arr[0]); quickSort(arr, 0, n - 1); printf("Sorted array: \n"); printArray(arr, n); return 0; } ``` Python实现: ```python def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr) // 2] # 选择中间元素作为基准 left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) # 测试代码 if __name__ == "__main__": arr = [10, 7, 8, 9, 1, 5] print("Sorted array:") print(quick_sort(arr)) ``` 这两种实现方式都展示了快速排序的核心思想: 1. 选择一个基准元素(pivot)。 2. 将数组分成两部分:小于等于基准的元素大于基准的元素。 3. 递归地对这两部分进行快速排序。 C语言版本使用了原地排序的方法,而Python版本则利用了列表推导式递归的特性,代码更加简洁。 快速排序的平均时间复杂度为O(nlogn),是最常用的排序算法之一。它的高效性主要来自于其分治策略原地排序的特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值