首页 > 编程语言 >深入了解快速排序算法

深入了解快速排序算法

时间:2023-09-13 16:37:27浏览次数:45  
标签:arr int 基准 算法 深入 数组 排序 快速

快速排序(Quick Sort)是一种高效的、分治法的排序算法,它在实际应用中被广泛采用,因为其性能优越。本文将详细介绍快速排序的工作原理,提供示例和Python、Go、Java以及C语言的实现代码。

快速排序的基本思想

快速排序的核心思想是通过选择一个基准元素,将数组划分为两个子数组:小于基准的子数组和大于基准的子数组。然后,递归地对这两个子数组进行排序,最后将它们合并起来,完成整个排序过程。

以下是快速排序的详细步骤:

  1. 选择基准元素: 从待排序的数组中选择一个基准元素。通常,我们选择第一个元素,但也可以使用其他策略,如随机选择。
  2. 划分数组: 将数组中的元素按照与基准元素的比较结果划分为两个子数组,一个包含小于基准的元素,另一个包含大于基准的元素。
  3. 递归排序: 对划分后的子数组递归地应用快速排序算法,分别排序小于基准的子数组和大于基准的子数组。
  4. 合并结果: 最后,将已排序的子数组合并起来,形成最终有序的数组。

快速排序的关键在于划分步骤,也就是如何选择基准元素和将元素分配到子数组的过程。这一过程的高效性使得快速排序在大多数情况下表现出色。

快速排序的示例

让我们通过一个示例来理解快速排序的工作原理。假设我们有一个整数数组 [5, 2, 9, 3, 4],我们希望按升序排序它。

  1. 选择基准元素: 我们选择第一个元素 5 作为基准。
  2. 划分数组: 我们遍历数组并将小于等于基准的元素放在左边,大于基准的元素放在右边。在这个示例中,划分后的结果是 [2, 3, 4] [5] [9]
  3. 递归排序: 我们对左边的子数组 [2, 3, 4] 和右边的子数组 [9] 分别应用快速排序。
  4. 合并结果: 最终,将左边的子数组 [2, 3, 4]、基准元素 5 和右边的子数组 [9] 合并起来,得到 [2, 3, 4, 5, 9],这就是排序后的数组。

快速排序的时间复杂度

快速排序通常具有较快的平均运行时间,并且在许多情况下表现优异。其平均时间复杂度为O(n*log(n)),其中n是数组的长度。在最坏情况下,时间复杂度为O(n^2),但这种情况较少发生,并且通过随机选择基准元素或使用三取样划分等方法可以避免。

与其他排序算法相比,快速排序通常更快,尤其是在处理大型数据集时。它是许多标准库中的默认排序算法,如Python的sorted()函数和Java的Arrays.sort()方法。

示例代码

以下是快速排序的示例代码,分别使用Python、Go、Java和C语言编写。

Python 快速排序

def quick_sort(arr):
    if len(arr) <= 1:
        return arr

    pivot = arr[0]
    less = [x for x in arr[1:] if x <= pivot]
    greater = [x for x in arr[1:] if x > pivot]

    return quick_sort(less) + [pivot] + quick_sort(greater)

arr = [5, 2, 9, 3, 4]
sorted_arr = quick_sort(arr)
print("排序后的数组:", sorted_arr)

Go 快速排序

package main

import "fmt"

func quickSort(arr []int) []int {
    if len(arr) <= 1 {
        return arr
    }

    pivot := arr[0]
    var less, greater []int

    for _, v := range arr[1:] {
        if v <= pivot {
            less = append(less, v)
        } else {
            greater = append(greater, v)
        }
    }

    less = quickSort(less)
    greater = quickSort(greater)

    return append(append(less, pivot), greater...)
}

func main() {
    arr := []int{5, 2, 9, 3, 4}
    sorted_arr := quickSort(arr)
    fmt.Println("排序后的数组:", sorted_arr)
}

Java 快速排序

import java.util.Arrays;

public class QuickSort {
    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            int pivotIndex = partition(arr, low, high);
            quickSort(arr, low, pivotIndex - 1);
            quickSort(arr, pivotIndex + 1, high);
        }
    }

    public static int partition(int[] arr, int low, int high) {
        int pivot = arr[low];
        int left = low + 1;
        int right = high;

        while (true) {
            while (left <= right && arr[left] <= pivot) {
                left++;
            }
            while (left <= right && arr[right] >= pivot) {
                right--;
            }
            if (left <= right) {
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
            } else {
                break;
            }
        }

        int temp = arr[low];
        arr[low] = arr[right];
        arr[right] = temp;

        return right;
    }

    public static void main(String[] args) {
        int[] arr = {5, 2, 9, 3, 4};
        quickSort(arr, 0, arr.length - 1);
        System.out.print("排序后的数组: ");
        System.out.println(Arrays.toString(arr));
    }
}

C 语言 快速排序

#include <stdio.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int partition(int arr[], int low, int high) {
    int pivot = arr[low];
    int left = low + 1;
    int right = high;

    while (1) {
        while (left <= right && arr[left] <= pivot) {
            left++;
        }
        while (left <= right && arr[right] >= pivot) {
            right--;
        }
        if (left <= right) {
            swap(&arr[left], &arr[right]);
        } else {
            break;
        }
    }

    swap(&arr[low], &arr[right]);
    return right;
}

void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pivotIndex = partition(arr, low, high);
        quickSort(arr, low, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, high);
    }
}

int main() {
    int arr[] = {5, 2, 9, 3, 4};
    int n = sizeof(arr) / sizeof(arr[0]);
    quickSort(arr, 0, n - 1);
    printf("排序后的数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

以上示例代码展示了不同编程语言中的快速排序算法实现。这些示例帮助你理解快速排序的工作原理,并提供了可供参考和使用的代码示例。无论使用哪种编程语言,快速排序都是一种高效的排序算法,适用于各种应用场景。

标签:arr,int,基准,算法,深入,数组,排序,快速
From: https://blog.51cto.com/u_16170163/7456029

相关文章

  • 代码随想录算法训练营第7天| ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和
    454.两数相加Ⅱmydemo--(超时失败)classSolution{public:intfourSumCount(vector<int>&nums1,vector<int>&nums2,vector<int>&nums3,vector<int>&nums4){intcount=0;for(inti=0;i<nums1.size()......
  • 【lssvm回归预测】基于变模态结合秃鹰算法优化最小二乘支持向量机VMD-BES-LSSVM实现数
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • C++算法进阶系列之倍增算法解决求幂运算
    1.引言学习倍增算法,先了解什么是倍增以及倍增算法的优势。如果面前有一堆石子,要求计算出石子的总数量。这是一个简单的数数问题,可以:一颗石子一颗石子的数。两颗石子两颗石子的数。三颗石子三颗石子的数。或者更多颗石子更多颗石子的数……在石子很多的情况下,每一次选择更......
  • Oracle 按字段排序
    1.单一字段排序在Oracle数据库中,我们可以通过ORDERBY子句来对查询结果进行排序。ORDERBY子句的基本语法如下:SELECTcolumn_name(s)FROMtable_nameORDERBYcolumn_name[ASC|DESC];SELECT*FROMstudentORDERBYageASC;2.多字段排序SELECT*FROMstudent......
  • 3秒掌握Marubozu交易算法,FPmarkets澳福和投资者轻易穿越牛熊
    所有人都在告诉你,使用Marubozu交易算法可以在交易市场盈利,但没有人告诉你如何在交易市场中盈利。其实很简单,能看到这里的投资者有福了,FPmarkets澳福分享3秒掌握Marubozu交易算法轻易穿越牛熊。当市场是牛市时,也就是下跌趋势后的低价区,或在上升趋势中突破阻力位时,找到看涨Marubozu蜡......
  • MySQL为什么改进LRU算法
    LRU算法概念介绍LRU(LeastRecentlyUsed,最近最少使用)算法是一种用于缓存管理的常见算法。它的核心思想是:当需要淘汰(替换)一个数据时,选择最长时间未被访问的数据进行淘汰,即选择最近最少使用的数据。以下是LRU算法的概念介绍和基本工作原理:缓存管理:LRU算法通常用于管理缓存中的数据。......
  • Glang 数组的排序和查找:快速丶希尔丶堆丶选择丶冒泡...
    一.数组的排序与查找1//数组的排序和查找2functestArrSort(){3//内部排序:将需要处理的所有数据都加载到内部存储器中进行排序(交换式排序法、选择式排序法、插入式排序)45//交换式排序法-冒泡排序:递归将最大或最小值冒泡到数组尾6Bu......
  • chatgpt能支持人工干预算法吗
    ​chatgpt是一种基于自然语言处理技术的聊天机器人模型,它可以通过输入自然语言文本来产生人类类似的回复。在ChatGPT的输出方面,一般情况下是不允许人工干预的,因为ChatGPT使用了生成式模型,其输出不是预先设定的模板式回答,而是根据对话上下文和模型的训练结果自动生成的自然语言文......
  • java数据结构与算法_____选择排序
    importjava.util.Arrays;/***@authorGod*选择排序(Selectionsort)是一种简单直观的排序算法。*它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,*存放在序列的起始位置,直到全部待排序的数据元素排完。*选择排序是不稳定的排序方法(比如序列[5,5,3......
  • 【智能优化算法】基于大逃杀优化算法BRO求解单目标优化问题附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......