首页 > 其他分享 >数据结构学习笔记-快速排序

数据结构学习笔记-快速排序

时间:2024-05-30 20:00:57浏览次数:14  
标签:arr 排序 int 笔记 high low 数组 数据结构

快速排序的算法设计与分析

问题描述:设计并分析快速排序

【算法设计思想】

  1. 选择基准值:从待排序数组中选择一个元素作为基准值(pivot)。在这个示例中,选择了数组中的最后一个元素作为基准值。
  2. 分割数组:将数组分割为两部分,小于等于基准值的元素放在基准值的左边,大于基准值的元素放在右边。这一步骤称为分割(partition)。
  3. 递归排序:对分割后的左右两个子数组分别进行快速排序。递归调用快速排序函数。
  4. 合并结果:排序完成后,所有的子数组都被排序,数组也就被完全排序了。

快速排序是一种分治算法,其基本思想是通过递归地将待排序数组划分为较小的子数组,然后分别对这些子数组进行排序。快速排序的核心是分割操作,通过一次遍历将数组分割为两个部分,并且保证左侧部分的元素都小于等于基准值,右侧部分的元素都大于基准值。这样,在递归过程中,每次排序都会将一个元素放置到其最终的位置上,直到整个数组排序完成。

【算法描述】

// 快速排序函数
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 partition(int arr[], int low, int high) {
    // 选取数组最后一个元素作为基准值
    int pivot = arr[high];
    int i = low - 1;

    for (int j = low; j < high; j++) {
        // 如果当前元素小于等于基准值,则将它与 i 指向的元素交换位置
        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;
}

【完整的测试程序】

#include <iostream>

void quicksort(int arr[],int low,int high);
int partition(int arr[],int low,int high);

// 快速排序函数
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 partition(int arr[], int low, int high) {
    // 选取数组最后一个元素作为基准值
    int pivot = arr[high];
    int i = low - 1;

    for (int j = low; j < high; j++) {
        // 如果当前元素小于等于基准值,则将它与 i 指向的元素交换位置
        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++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
}

// 主函数
int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);

    std::cout << "排序前的数组: " << std::endl;
    printArray(arr, n);

    // 调用快速排序函数
    quickSort(arr, 0, n - 1);

    std::cout << "排序后的数组: " << std::endl;
    printArray(arr, n);

    return 0;
}

标签:arr,排序,int,笔记,high,low,数组,数据结构
From: https://www.cnblogs.com/zeta186012/p/18220746

相关文章

  • 模型节点操作学习笔记(1)--SavedModel详解
    参考:使用SavedModel格式 | TensorFlowCore(google.cn) (持续更新)   SavedModel是一个包含序列化签名和运行这些签名所需的状态的目录,其中包含变量值和词汇表。$ls{mobilenet_save_path}assetsfingerprint.pbsaved_model.pbvariablesassets目......
  • Java--hashmap如何根据value排序
    java中map根据value排序在Java中,Map是一种非常常用的数据结构,它通过键值对的形式存储数据,Map本身是无序的,但是在实际应用中,我们有时需要根据Map的值来进行排序,本文将介绍如何使用Java中的Map来实现根据Value排序。Map转TreeMap在Java中,可以使用TreeMap来根据HashMap的值......
  • 优化Python中的数据结构与算法(指南)
    ......
  • JavaWeb笔记整理+图解——Filter过滤器
    欢迎大家来到这一篇章——Filter过滤器监听器和过滤器都是JavaWeb服务器三大组件(Servlet、监听器、过滤器)之一,他们对于Web开发起到了不可缺少的作用。ps:想要补充Java知识的同学们可以移步我已经完结的JavaSE笔记,里面整理了大量详细的知识点和图解,可以帮你快速掌握Java编程的......
  • JS+DOM简要笔记
    js官方文档:https://www.w3school.com.cn/js/index.asp简单理解:html是内容,css是控制样式,js是行为。1,js弱类型特点JavaScript是一种解释型的脚本语言,C、C++等语言先编译后执行,而JavaScript是在程序的运行过程中逐行进行解释。JavaScript是一种基于对象的脚本语言,可以创......
  • 有关指针的学习笔记
    指针简介指针,顾名思义就是只想某一个地方而这个地方就是某个数据存放的地址如图,我们构造了一个整形变量a并赋值为一我们在想构造类型的前缀后加  *便表示是该类型的指针而我们构造的指针q便指向了整型变量a的地址指针有很多类型比如这个就是一个字符串指针......
  • JavaDS-学习数据结构之如果从零开始手搓顺序表,顺带学习自定义异常怎么用!
    前言笔者开始学习数据结构了,虽然笔者已经会用了,不管是C++中的stl亦或是Java中的集合,为了算法比赛多少都突击过,但只知其然而不知其所以然,还是会限制发展的,因此,笔者写下这篇博客.内容是手搓一个顺序表.顺带加一点异常的使用,大伙看个乐子就好了.有错误直接私信喷我就......
  • 随机森林笔记
    学习网址:https://blog.csdn.net/wjjc1017/article/details/135904420随机森林(RandomForest)属于集成算法里的Bagging方法,其中Bagging属于多个分类器里的并行方法,Boosting(属于多个分类器里的串行方法)。核心思想是根据多个分类器的结果,判定为票数多的类别,如果是回归,则是多个回归结......
  • 论文阅读笔记(十)——CRISPR-GPT: An LLM Agent for Automated Design of Gene-Editin
    论文阅读笔记(十)——CRISPR-GPT:AnLLMAgentforAutomatedDesignofGene-EditingExperiments目录论文阅读笔记(十)——CRISPR-GPT:AnLLMAgentforAutomatedDesignofGene-EditingExperimentsAbstract简介名词解释问题CRISPR-GPT概述MethodToolProvider......
  • OpenStack学习笔记之四:Cinder流程介绍及GlusterFS存储对接
    4、Cinder详解及存储对接4.1Cinder流程介绍4.1.1流程结构Cinder服务由四个进程组成:①cinder-api是一个WSGI应用程序,它接受并验证来自客户端的REST(JSON或XML)请求,并通过AMQP将它们路由到适当的其他Cinder进程。②cinder-scheduler确定哪个后端应作为卷创建或移动请求......