排序——5.快速排序

快速排序

快速排序的核心思想:

1.选出数组中一个元素,将整个数组中比他小的元素放在他左边,比他大的放在他右边。这样整个数组就被分成了两部分,被选出的那个元素就在这两部分中间。

2.再对每一部分执行同样的操作。

3.重复执行第2步,直到每一个部分只有一个元素。

具体是这样实现的,假设有数组a[10]:

选定第一个元素,这里需要一个中间变量来储存选定的元素,int key = a[0]

从右边开始分别与选定的这个元素(也就是a[0]=8)比较,直到一个小于等于8的元素,在这个数组中是a[7]=5。

然后将5放置到a[0]的位置(因为我们已经把a[0]的值放置到变量key中,这样a[0]相当于空了,实际上还是8,但对我们已经没用了)

再从左到右从第一个元素开始分别与key比较大小,同样是将找到的第一个比key大元素的放到刚刚空出来的地方,在这个数组中从左到右第一个比8大的元素是a[8]=11,填到空位里去就是这样:

这样就又出来一个空位,我们再从右到左分别和key比较,然后填空位·······

以此类推,每次填上一个空位就会又多出一个空位直到没有元素可以比较,这时候将key填到剩下的那个空位:

完成这样一次循环,数组被分为两部分:

      和       

对这每一部分都执行一次上边的分解操作,直到分解到每部分只有用一个元素

这时候就已经完成了排序。

代码入下:

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

namespace 快速排序
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] a = new int[] { 8, 4, 6, 3, 2, 1, 8, 5, 11, 25 };
            Console.WriteLine("未排序之前的顺序:");
            foreach (int s in a)
            { Console.WriteLine("    {0}", s); }

            QuickSort(a,0,a.Length-1);

            Console.WriteLine("排序之后的顺序:");
            foreach (int s in a)
            { Console.WriteLine("    {0}", s); }
            Console.ReadKey();
        }

        public static void QuickSort(int[] Arr, int left,int right)
        {
            if (left >= right)
            { return; }
            int i = left;
            int j = right;
            int key = Arr[left];
            while (i < j)
            {
                while (i < j && key <= Arr [j])
                {
                    j--;
                }

                Arr[i] = Arr[j];//这个时候a[j]就是个空位
                while (i < j && key > Arr[i])
                {
                    i++;
                }

                Arr[j] = Arr[i];//这个时候a[i]就是个空位
            }
            Arr[i] = key;//用key填上空位
            QuickSort(Arr, left, i - 1);
            QuickSort(Arr, i + 1, right);

        }
    }
}

运行结果:

总结一下:大的放右边,小的放左边

时间: 2024-10-04 18:27:23

排序——5.快速排序的相关文章

Java排序算法 快速排序

排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列.下面让我们一起来看快速排序. AD: 快速排序(Quicksort)是对冒泡排序的一种改进.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.快速排序不稳定,O(log(n))的额外空间,时间复杂度为O(nlog

Go语言实现冒泡排序、选择排序、快速排序及插入排序的方法_Golang

本文实例讲述了Go语言实现冒泡排序.选择排序.快速排序及插入排序的方法.分享给大家供大家参考.具体分析如下: 算法是程序的灵魂,而排序算法则是一种最基本的算法.排序算法有许多种,这里介绍4中排序算法:冒泡排序,选择排序,快速排序和插入排序,以从小到大为例. 一.冒泡排序 冒泡排序的原理是,对给定的数组进行多次遍历,每次均比较相邻的两个数,如果前一个比后一个大,则交换这两个数.经过第一次遍历之后,最大的数就在最右侧了:第二次遍历之后,第二大的数就在右数第二个位置了:以此类推. 复制代码 代码如下:

排序算法——快速排序

今天介绍快速排序,这也是在实际中最常用的一种排序算法,速度快,效率高.就像名字一样,快速排序是最优秀的一种排序算法. 思想 快速排序采用的思想是分治思想. 快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置.递归快速排序,将其他n-1个元素也调整到排序后的正确位置.最后每个元素都是在排序后的正 确位置,排序完成.所以快速排序算法的核心算法是分区操

冒泡排序、插入排序、选择排序、快速排序、二分查找(Objective-C实现)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 8

JavaScript希尔排序、快速排序、归并排序算法_javascript技巧

以var a = [4,2,6,3,1,9,5,7,8,0];为例子. 1.希尔排序. 希尔排序是在插入排序上面做的升级.是先跟距离较远的进行比较的一些方法. function shellsort(arr){ var i,k,j,len=arr.length,gap = Math.ceil(len/2),temp; while(gap>0){ for (var k = 0; k < gap; k++) { var tagArr = []; tagArr.push(arr[k]) for (i

python 算法 排序实现快速排序_python

QUICKSORT(A, p, r)是快速排序的子程序,调用划分程序对数组进行划分,然后递归地调用QUICKSORT(A, p, r),以完成快速排序的过程.快速排序的最差时间复杂度为O(n2),平时时间复杂度为O(nlgn).最差时间复杂度的情况为数组基本有序的时候,平均时间复杂度为数组的数值分布较为平均的时候.在平时情况下快速排序跟堆排序的时间复杂度都为O(nlgn),但是快速排序的常数项较小,所以要优于堆排序. PARTITION(A, p, r) 复制代码 代码如下: x ← A[r]

采用部分快速排序算法实现数组的部分排序

快速排序算法,网上相关文章已经介绍的很多了,数据结构教材中也有很详 细的介绍.本文需要阐述的不是全排序快速排序算法,而是部分快速排序算法. 所谓部分快速排序算法是指通过排序获取一个数列中最大的若干条有序记录.比如我们需要从一个有1百万记录的数组中获取前100条有序记录,并按从大到小顺 序显示给用户,这种应用在搜索引擎中经常被使用,很少会有人有耐心将100万 条搜索出来的记录都阅读一遍,一般阅读前几百条纪录就可以得到自己满意的答案.其实这种算法很像SQLSERVER 中的TOP n 的实现,不过数

【算法导论】排序 (三):快速排序 深入分析

五.快速排序 快速排序是最常用的一种排序算法,包括C的qsort,C++和Java的sort,都采用了快 排(C++和Java的sort经过了优化,还混合了其他排序算法). 快排最坏情况O( n^2 ),但平均效率 O(n lg n),而且这个O(n lg n)几号中隐含的常数因子很小,快排可以说是最快的排序算法,并非浪得虚名 .另外它还是就地排序. 快速排序是基于分治模式的: 分解:数组A[p..r]被划分成两个(可能空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的

内部排序算法:快速排序

基本思想 设当前待排序的数组无序区为R[low..high],利用分治法可将快速排序的基本思想描述为: 分解: 在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左.右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(