数据结构-快速排序(C#实现)

快速排序的主要思路:

1.在数组首尾处各设一个标记

2.取出数组第一个值作为中枢值

3.所有数据跟中枢值比较:比中枢值小的放中枢值左边,首部标记++往右推一位,大的放中枢值右边,尾部标记--往左推一位(从小到大排序)

4.先从尾部开始与中枢值比较,如果尾部标记的值比中枢值大直接把标记往左推一位,如果尾部标记比中枢值小就把尾部标记的值放到首部标记的位置,然后开始从首部开始与中枢值比较,如果首部标记的值比中枢值小直接把标记往右推一位,如果首部标记比中枢值大就把首部标记的值放到尾部标记的位置,一直循环直至首尾标记相遇。

5.首尾标记相遇代表找到了中枢值的准确位置,此时将数组从中枢值一分为二,使用递归继续对中枢值左右两侧的数据使用相同的方法进行排序;

C#示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace QuickSort
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] array = { 7, 1, 5, 4, 6, 7, 3, 9, 8, 2 };
            QuickSort(0, 9, ref array);
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(array[i]);
            }
            return;
        }

        static void QuickSort(int iMin,int iMax,ref int[] a)
        {
            int i = iMin, j = iMax, iPivot = a[iMin];
            if (iMin >= iMax)
            {
                return;
            }
            while (i < j)
            {
                while (a[j] >= iPivot && i < j)
                {
                    j--;
                }
                if (i < j)
                {
                    a[i] = a[j];
                    i++;
                }
                while (a[i] <= iPivot && i < j)
                {
                    i++;
                }
                if (i < j)
                {
                    a[j] = a[i];
                    j--;
                }
            }
            a[i] = iPivot;
            QuickSort(iMin, i - 1, ref a);
            QuickSort(i + 1, iMax, ref a);
        }
    }
}

相关视频链接:https://ke.qq.com/webcourse/index.html#course_id=150239&term_id=100171220&taid=686915594635999&vid=b1411uydxse

时间: 2024-09-28 21:51:29

数据结构-快速排序(C#实现)的相关文章

[数据结构] 快速排序

基本思想 快速排序(Quicksort)是对冒泡排序的一种改进,又称划分交换排序(partition-exchange sort. 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). 步骤为: ①.从数列中挑出一个元素,称为"基准"(pivot) ②.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在这个分区结束之后,该基准就处于数列的中间位置.这个称

数据结构---快速排序 &nbsp; java

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 设要排序的数组是A[0]--A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过

数据结构——快速排序算法

今天来说一说快速排序: 基本思想: 任取一个元素 (如第一个) 为轴点 所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表 对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个 注意: 每一趟的子表的形成是采用从两头向中间交替式逼近法 由于每趟中对各子表的操作都相似,可采用递归算法 代码实现: #include <iostream> using namespace std; //找到第一个轴点,以这个轴点为界,将待排序的数组划分为 //[low,pivot),[pi

数据结构-快速排序算法

一趟快速排序的算法是: 1)设置两个变量i.j,排序开始的时候:i=0,j=N-1: 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]: 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换: 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换: 5)重复第3.4步,直到i=j: (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于ke

[golang] 数据结构-快速排序

快速排序是个非常经典.高效.常用的排序算法.很多语言标准库里的排序算法都有用到它. 原理快排原理其实比较简单,就是将原本很大的数组拆成小数组去解决问题.要拆就得找个拆的位置.如果吧这个位置称为支点,那么快速排序问题就变成了不断的去找到拆分的支点元素位置.通常找支点就是以某个元素为标准,分别从最右侧元素向左找到比指定元素小的位置,再从最左侧开始向右找比指定元素大的位置.如果两个位置不相同就交换两个位置,在继续分表从两头相向寻找.找到合适的位置就是我们需要的支点.支点两边的元素再各自重复上面的操作,

python算法与数据结构-快速排序(36)

一.快速排序的介绍 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 二.快速排序的原理 从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同

java - 数据结构 - 快速排序

- -网上找结果很多都是无法排序有重复数据的,因此查了查资料写个改良版 百度百科: 快速排序算法通过多次比较和交换来实现排序,其排序流程如下: (1)首先设定一个分界值,通过该分界值将数组分成左右两部分. (2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边.此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值. (3)然后,左边和右边的数据可以独立排序.对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,

常见前端深度问题

1.数据结构 快速排序的原理,时间复杂度2.js的事件委托原理. window.onload = function(){ var oUl = document.getElementById("ul1"); oUl.onclick = function(ev){ var ev = ev || window.event; var target = ev.target || ev.srcElement; if(target.nodeName.toLowerCase() == 'li'){ a

Summary

PDF 暑假开始准备转移博客,试了几个都不怎么满意(我还去试了下LineBlog 不知道那时候在想什么..) 现在暂时转移至WordPress,不过还在完善中,预计..算了不瞎预计的好.. 课上说最好做个代码集,嗯嗯 我也觉得挺有必要的 毕竟现在我连Floyd怎么写都忘了 无脑SPFA_(:з」∠)_ 反正有用没用都稍微写一下,暂定是目录这些,有些还在找例题.整理代码什么的,所以还是空的. GItHub上还欠了几题,之后会补上来. 我做的二级目录到博客园就被无视了,,将就看看吧 感觉实在简陋了些