快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

原理:

1.从数列中挑出一个元素,称为 “基准”(pivot);

2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

        static int[] QuickSort(int[] arr, int low, int high)
{
if (low < high)
{ int key = arr[low];//1.这里选arr[low]为基准数
var left = low;
var right = high;
while (left < right) //2. 分区操作,比基准数小的放左边,大的放右边
{
//从序列右往左比较,比基准数小的拿出来,放到基准数的左边
while (left < right)
{
if (arr[right] < key)
{
arr[left] = arr[right];
break;
}
else
{
right--;//左移下一个数字进行比较
}
} //从序列左往右比较,比基准数大的拿出来,放到基准数的右边
while (left < right)
{
if (arr[left] > key)
{
arr[right] = arr[left];
break;
}
else
{
left++;//右移下一个数字进行比较
} } }
//2. 分区退出之后,基准数恰好位于中间位置
//跳出循环,现在left==right left是中间位置
arr[left] = key;
//3.再次递归
QuickSort(arr, low, left - 1);//左边再次排序
QuickSort(arr, left + 1, high);//右边再次排序 }
return arr; }

排序结果

        static void Main(string[] args)
{
Console.WriteLine($"数据算法");
var arr1 = GetArrayData(8, 1, 22);
Console.WriteLine($"生成未排序数据arr1:{ShowArray(arr1)}");
//var arr2 = BubbleSort(arr1);
//Console.WriteLine($"冒泡排序:{ShowArray(arr2)}");
//var arr3 = SelectSort(arr1);
//Console.WriteLine($"选择排序arr3:{ShowArray(arr3)}");
//var val = arr3[3];
//var arr4= InsertSort(arr1);
//Console.WriteLine($"插入排序arr4:{ShowArray(arr4)}");
var arr5= QuickSort(arr1, 0, arr1.Length - 1);
Console.WriteLine($"快速排序arr5:{ShowArray(arr5)}"); //var index= BinarySearch(arr3, 0, arr1.Length - 1,val);
//Console.WriteLine($"{val}在 arr3中出现的索引位置是{index}");
//var val2 = arr3[4];
//var index2 = BinarySearch2(arr3, val2);
//Console.WriteLine($"{val2}在 arr3中出现的索引位置是{index2}");
Console.ReadLine();
}

C#排序算法6:快速排序的更多相关文章

  1. Java常见排序算法之快速排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  2. 常用排序算法之——快速排序(C语言+VC6.0平台)

    经典排序算法中快速排序具有较好的效率,但其实现思路相对较难理解. #include<stdio.h> int partition(int num[],int low,int high) / ...

  3. Python之排序算法:快速排序与冒泡排序

    Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...

  4. Java排序算法之快速排序

    Java排序算法之快速排序 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分 ...

  5. javascript高级排序算法之快速排序(快排)

    javascript高级排序算法之快速排序(快排)我们之前讨论了javascript基本排序算法 冒泡排序 选择排序 插入排序 简单复习: 冒泡排序: 比较相邻的两个元素,如果前一个比后一个大,则交换 ...

  6. javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...

  7. 排序算法之快速排序Java实现

    排序算法之快速排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb  选择排序:http://t.cn/hros6e  插入排序:ht ...

  8. Python实现排序算法之快速排序

    Python实现排序算法:快速排序.冒泡排序.插入排序.选择排序.堆排序.归并排序和希尔排序 Python实现快速排序 原理 首先选取任意一个数据(通常选取数组的第一个数)作为关键数据,然后将所有比它 ...

  9. 基础排序算法之快速排序(Quick Sort)

    快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...

  10. C++编程练习(16)----“排序算法 之 快速排序“

    快速排序 基本思想: 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 算法介绍: 设要排序的 ...

随机推荐

  1. [ABC278G] Generalized Subtraction Game

    Problem Statement This is an interactive task (where your program interacts with the judge's program ...

  2. 组合式api-跨层级组件通信provide和inject

    vue2的provide和inject:https://v2.cn.vuejs.org/v2/api/#provide-inject 主要作用: 跨层级传递数据(响应和非相应数据都可以).方法(函数) ...

  3. Oracle参数文件spfile

    spfile:server parameter file. spfile只能通过OEM(oracle enterprise manager)软件或者alter system命令进行修改. spfile ...

  4. vue 2实战系列 —— 复习Vue

    复习Vue 近期需要接手 vue 2的项目,许久未写,语法有些陌生.本篇将较全面复习 vue 2. Tip: 项目是基于 ant-design-vue-pro ant-design-vue-pro 由 ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (36)-- 算法导论5.3 6题

    六.请解释如何实现算法 PERMUTE-BY-SORTING,以处理两个或更多优先级相同的情形.也就是说,即使有两个或更多优先级相同,你的算法也应该产生一个均匀随机排列. 文心一言: 算法 PERMU ...

  6. CodeForces 1082E Increasing Frequency 计数 递推 思维

    原题链接 题意 给我们一个长为n的序列A以及一个整数c,对这个序列的任何一个连续区间[l, r],我们可以给这个区间内的数统一加上一个我们任取的整数k. 要求我们只能做上述操作一次,问最终序列内最多有 ...

  7. position的属性值

    (fixed的父元素永远是浏览器窗口,不会根据页面滚动而改变位置:absolute的父元素是可以设置的,他会永远跟随父元素的位置的改变而改变.) 1.position: relative;相对定位 不 ...

  8. Cesium案例解析(九)——Rotatable2DMap旋转2D地图

    目录 Cesium的Rotatable 2D Map示例展示了一个旋转的二维地图: 'use strict'; var viewer = new Cesium.Viewer('cesiumContai ...

  9. 从零开始学python | 使用Python映射,过滤和缩减函数:所有您需要知道的

    摘要:在本文中,您将学习Python中的三个令人印象深刻的函数,即map(),filter和reduce(). Python提供了许多预定义的内置函数,最终用户可以通过调用它们来使用它们.这些功能不仅 ...

  10. 40个问题让你快速掌握Java多线程的精髓

    摘要:多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这些线程可以同时利用CPU的多个核心运行. 多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这 ...