c语言快速排序算法总结(详解)

快速排序是一种分治算法,其基本原理如下:

  1. 选择一个基准元素(pivot),通常选择序列中的第一个元素。
  2. 将序列分为两部分,使得左边部分的元素都小于等于基准元素,右边部分的元素都大于基准元素。这个过程称为分区(partition)操作。
  3. 对左右两部分分别递归地应用快速算法>排序算法
  4. 当左右两部分都排序完毕后,整个序列就变得有序。

具体实现时,快速排序的分区操作可以采用多种方法,常见的是使用双指针或者挖坑填数的方式进行分区。在实际应用中,为了提高排序的稳定性,通常会对小规模子序列采用其他算法>排序算法,例如插入排序。快速排序的时间复杂度通常为O(nlogn),在最坏情况下为O(n^2)。快速排序是一种不稳定的算法>排序算法,因为在分区操作中可能会改变相同元素的相对顺序。快速排序在实际应用中广泛使用,因为它在平均情况下具有较好的性能,并且可以采用原地排序的方式,节省了额外的空间开销。
在这里插入图片描述递归结束的条件是I < J

快速排序代码截图

在这里插入图片描述快速排序代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include <time.h>
#include <sys/timeb.h>

#define MAX 10
using namespace std;

// 打印函数
void PrintArray(int arr[], int length) {
    for (int i = 0; i < length; i++) {
        cout << arr[i] << " ";

    }
    cout << endl;

}
// 快速排序的实现,从小到大
void QuickSort(int arr[],int start, int end) {
    // 
    int i = start;
    int j = end;
    // 基准数所有的数都和他进行比较
    int temp = arr[start];

    if (i < j) {
    
        while (i < j) {
            while (i < j && arr[j] >= temp) {
                //从右向左找符合条件的
                j--;
    
            }
            // 填充数据
            if (i < j) {
                arr[i] = arr[j];
                i++;
            }
            // 从左向右找比基准数更大的数
            while (i < j && arr[i] < temp) {
                i++;
            }
            // 填坑
            if (i < j) {
                arr[j] = arr[i];
                j--;
            }
        }
        // 把基准数放到i的位置或者是j的位置
        arr[i] = temp;
        // 对基准数的左半部分进行快速排序
        QuickSort(arr, start, i - 1);
        // 对基准数的右半部分进行快速排序
        QuickSort(arr, i + 1, end);
    }

}

int main(void)
{
    int myArr[] = { 4,2,8,0,5,7,1,3,9 };
    int len = sizeof(myArr) / sizeof(myArr[0]);
    PrintArray(myArr, len);
    QuickSort(myArr,0,len - 1);
    PrintArray(myArr, len);


    return 0;

}

快速排序运行结果展示

在这里插入图片描述


http://www.niftyadmin.cn/n/5250245.html

相关文章

【部署】Deploying Trino on linux

文章目录 一. Requirements1. Linux operating system2. Java 环境3. Python 二. Installing Trino三. Configuring Trino1. 节点配置2. JVM 配置3. Config properties4. Log levels5. Catalog properties 四. Running Trino 一. Requirements 1. Linux operating system 64位…

【工程实践】使用modelscope下载大模型文件

前言 Modelscope&#xff08;魔搭社区&#xff09;是阿里达摩院的一款开源模型平台&#xff0c;里面提供了很多的热门模型供使用体验&#xff0c;其中的模型文件可以通过git clone 快速下载。并且为模型提供了Notebook的快速开发体验&#xff0c;使用阿里云服务&#xff0c;不需…

六、C#笔记

/// <summary> /// 第九章&#xff1a;使用枚举和结构创建值类型 /// </summary> namespace Chapter9 { class Program { ///9.2.3声明结构变量 private Time currentTime; static void Main(string[] args) { …

python+paddleocr 进行图像识别、找到文字在屏幕中的位置

目录 前言 1、安装paddleocr 2、安装PIL 3、安装numpy 4、 安装pyautogui 5、进行文本识别 6、识别结果 7、获取文字在图片/屏幕中的位置 8、pyautoguipaddleocr鼠标操作 9、完整代码 前言 最近在做自动化测试&#xff0c;因为是处理过的界面&#xff0c;所以使用pyw…

旺店通无代码API集成:电商平台的客服系统和营销自动化解决方案

无代码API集成的力量 在数字化转型的浪潮中&#xff0c;电商平台迅速崛起&#xff0c;成为企业不可或缺的销售和市场推广渠道。旺店通企业版奇门以其无代码开发的连接和集成能力&#xff0c;重塑了电商系统的运营模式。无需繁琐的API开发&#xff0c;企业即可实现电商平台与客…

Vue项目中实现浏览器标签页名字的动态修改

修改router/index.js文件 路由条目下面添加meta属性 meta:{title:DevOps运维平台 }示例 使用Vue的全局守卫函数beforeEach&#xff0c;在路由切换前动态修改浏览器标签页名字 router.beforeEach((to,from,next) > {document.title to.meta.titlenext() })

深入了解对象与内置构造函数

1. 深入对象 1.1 创建对象的三种方式 1.2 构造函数 语法约定&#xff1a; 总结 构造函数可以快速创建多个对象大写字母开头的函数使用new关键字将对象实例化构造函数不需要返回值自动返回新的对象 new实例化的执行过程 创建空对象this指向对象执行代码&#xff0c;追加新…

Android Canvas 改变背景颜色

我有一个有两个 View 的应用 <com.myexample.ui.view.BackgroundView android:id"id/id_draw_canvas_classroom" android:layout_width"fill_parent" android:layout_height"fill_parent" android:layout_marginBottom"3dp" andro…