算法 quick sort
- // --------------------------------------------------------------------------------------------------------------------
- //
- //
- // Respect the work.
- //
- // </copyright>
- // <summary>
- //
- // The quick sort.
- //
- // 高速排序(QuickSort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据要小,然后再按此方法对这两部分数据分别进行高速排序。整个排序过程能够递归进行,以此达到整个数据变成有序序列。
- //
- // 设要排序的数组是a[0]...a[N-1],首先随意选取一个数据(通常选用数组的首元素)作为重要数据,然后将全部比它小的数都放到它的前面,全部比它大的数都放到它的后面,这个过程称为一趟高速排序。
值得注意的是,高速排序不是一种稳定的排序算法。也就是说,多个同样的值的相对位置或许会在算法结束时产生变动。
- // 一趟高速排序的算法是:
- // 1)设置两个变量i、j,排序開始的时候:i=0,j=N-1。
- // 2)以数组首元素作为重要数据,赋值给pivot,即pivot=a[0]。
- // 3)从j開始向前搜索,即由后開始向前搜索(j--),找到第一个小于pivot的值a[j],将a[j]赋值给a[i];
- // 4)从i開始向后搜索,即由前開始向后搜索(i++),找到第一个大于pivot的值a[i],将a[i]赋值给a[j];
- // 5)反复第3、4步,直到i==j;(在3、4步中。若没找到符合条件的值,即3中a[j]不小于pivot,4中a[i]不大于pivot的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。
若找到符合条件的值,进行替换的时候i、j指针位置不变。
)
- //
- // 高速排序的平均时间复杂度是:O(nlog<sub>2</sub>n)。
- //
- // </summary>
- // --------------------------------------------------------------------------------------------------------------------
- namespace CSharpLearning
- {
- using System;
- /// <summary>
- /// The program.
- /// </summary>
- public static class Program
- {
- /// <summary>
- /// The main.
- /// </summary>
- public static void Main()
- {
- int[] a = { 101, 93, 856, 7, 62, 15, 84, 3, 298, 1256 };
- Console.WriteLine("Before Quick Sort:");
- foreach (int i in a)
- {
- Console.Write(i + " ");
- }
- Console.WriteLine("\r\n");
- Console.WriteLine("In Quick Sort:");
- QuickSort(a, 0, 9);
- Console.WriteLine("\r\nAfter Quick Sort:");
- foreach (int i in a)
- {
- Console.Write(i + " ");
- }
- Console.WriteLine(string.Empty);
- }
- /// <summary>
- /// 高速排序。
- /// </summary>
- /// <param name="a">
- /// 待排序数组。
- /// </param>
- /// <param name="low">
- /// 待排序数组的排序起始位置。
- /// </param>
- /// <param name="high">
- /// 待排序数组的排序终止位置。
- /// </param>
- private static void QuickSort(int[] a, int low, int high)
- {
- if (low >= high)
- {
- return;
- }
- int pivot = QuickSortOnce(a, low, high);
- // 输出每一次排序。
- foreach (int i in a)
- {
- Console.Write(i + " ");
- }
- Console.WriteLine(string.Empty);
- // 对枢轴的左端进行排序。
- QuickSort(a, low, pivot - 1);
- // 对枢轴的右端进行排序。
- QuickSort(a, pivot + 1, high);
- }
- /// <summary>
- /// 一趟高速排序。
- /// </summary>
- /// <param name="a">
- /// 待排序数组。
- /// </param>
- /// <param name="low">
- /// 待排序数组的排序起始位置。
- /// </param>
- /// <param name="high">
- /// 待排序数组的排序终止位置。
- /// </param>
- /// <returns>
- /// 返回枢轴的位置。
- /// </returns>
- private static int QuickSortOnce(int[] a, int low, int high)
- {
- // 将首元素作为枢轴。
- int pivot = a[low];
- int i = low, j = high;
- while (i < j)
- {
- // 从右到左,寻找首个小于pivot的元素。
- while (a[j] >= pivot && i < j)
- {
- j--;
- }
- // 运行到此,j一定指向从右端起首个小于或等于pivot的元素。运行替换。
- a[i] = a[j];
- // 从左到右,寻找首个大于pivot的元素。
- while (a[i] <= pivot && i < j)
- {
- i++;
- }
- // 运行到此。i一定指向从左端起首个大于或等于pivot的元素。
运行替换。
- a[j] = a[i];
- }
- // 退出while循环,运行至此,必然是i==j的情况。i(或j)指向的即是枢轴的位置,定位该趟排序的枢轴并将该位置返回。
- a[i] = pivot;
- return i;
- }
- }
- }
- // Output:
- /*
- Before Quick Sort:
- 101 93 856 7 62 15 84 3 298 1256
- In Quick Sort:
- 3 93 84 7 62 15 101 856 298 1256
- 3 93 84 7 62 15 101 856 298 1256
- 3 15 84 7 62 93 101 856 298 1256
- 3 7 15 84 62 93 101 856 298 1256
- 3 7 15 62 84 93 101 856 298 1256
- 3 7 15 62 84 93 101 298 856 1256
- After Quick Sort:
- 3 7 15 62 84 93 101 298 856 1256
- */
算法 quick sort的更多相关文章
- 快速排序算法 quick sort的理解
最近做了一下算法的一些练习,感觉基础薄弱了,只是用一些已经有的东西来完成练习如quickSort(c++使用的时候是sort(起始位置,终止位置,比较函数),这个需要加头文件),但是不知道怎么推出来, ...
- 快速排序算法 Quick sort
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4046189.html 首先随机选择一个轴,并调整数组内各个数字,使得比轴值大的数在轴的右边, ...
- [算法]——快速排序(Quick Sort)
顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...
- 基础排序算法之快速排序(Quick Sort)
快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...
- 经典排序算法 - 高速排序Quick sort
经典排序算法 - 高速排序Quick sort 原理,通过一趟扫描将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整 ...
- Java中的经典算法之快速排序(Quick Sort)
Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...
- 排序算法—快速排序(Quick Sort)
快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...
- 【算法】快速排序(Quick Sort)(六)
快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...
- [算法] 快速排序 Quick Sort
快速排序(Quick Sort)使用分治法策略. 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分:其中一部分的所有数据都比另外一部分的所有数据都要小.然后,再按此方法对这 ...
随机推荐
- Android面试,BroadCastReceiver的两种注册方式的异同
在Android手机应用程序中开发中,需要用到BroadcastReceiver来监听广播的消息.在自定义好BroadcastReceiver ,需要对其进行注册,注册有两种方法: 一种是在代码当中注 ...
- Sqlite-SQLiteHelper类,操作SQLite数据库
using System; using System.Data; using System.Text.RegularExpressions; using System.Xml; using Syste ...
- 红帽RHOP 8 发布一条龙方案
导读 日前,Canonical的Ubuntu在OpenStack的云系统方面处于业界领先地位.其他诸如IBM类顶级科技公司也有意加入OpenStack的混战,新的专用OpenStack公司(例如Mir ...
- Jfinal极速开发微信系列教程(二)--------------让微信公众平台通过80端口访问本机
概述: 微信公众平台要成为开发者,需要填写接口配置信息中的“URL”和“Token”这两项(参见:http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E ...
- Wifidog及认证过程初分析
Wifidog初分析 一.综述 wifidog是搭建无线热点认证系统的解决方案之一,他比nocat.nodog更适合互联网营销思路.常见的使用在openwrt系统上,它实现了路由器和认证服务器的数据交 ...
- 教大家如何在word 2007中同时打出对齐上下标以及字母头上有波浪线(非编辑器)
教大家如何在word 2007中打出(非编辑器): 如果要在多个字符串上面加上划线,可以使用一下步骤 按下“Ctrl+F9”组合键,出现“{}”,在{}中输入“EQ \x\to(要加上划线的字符串)” ...
- PHP - AJAX 与 MySQL
PHP - AJAX 与 MySQL AJAX 可用来与数据库进行交互式通信. AJAX 数据库实例 下面的实例将演示网页如何通过 AJAX 从数据库读取信息: 本教程使用到的 Websites 表 ...
- Java同步机制总结--synchronized
不久前用到了同步,现在回过头来对JAVA中的同步做个总结,以对前段时间工作的总结和自我技术的条理话.JAVA中synchronized关键字能够 作为函数的修饰符,也可作为函数内的语句,也就是平时说的 ...
- Google C++ Coding Style 学习笔记
写在前面:最新公司马上就要开始开发一款视觉产品,工程量较大,且需要对客户提供可以二次开 发的SDK,整个项目用C++编写. 这就对代码质量提出了非常高的要求,同时,如何设计出优雅稳定的API也是相当大 ...
- Java面试必问,ThreadLocal终极篇
转载自掘金占小狼博客. 前言 在面试环节中,考察"ThreadLocal"也是面试官的家常便饭,所以对它理解透彻,是非常有必要的. 有些面试官会开门见山的提问: “知道Thread ...