面试指南 - 请实现一个快速排序算法

  快速排序算法是诸多排序算法中性能较优的一种,也是很多内建排序类型所采用的算法。该算法在.NET面试和笔试中经常被考查到,下面将详细介绍快速排序的算法思想及代码示例。

所涉及的知识点:

  • 使用C#实现快速排序算法

分析问题:

  快速排序算法是公认的最为优秀的内部排序算法之一,其实实现思想很简单,并且在一般情况下性能较高。下面是该算法的基本思想:

  1. 假设待排序的序列为L[m...n],其中L[m...midlle-1]中的每个元素都小于L[midlle],而L[midlle+1...n]中的每个元素都大于L[midlle]。
  2. 递归调用快速排序算法,对L[m...midlle-1]和L[midlle+1...n]分别进行排序。
  3. 由于是原地排序,所以递归结束后自然形成了有序序列。

  下列代码给出了快速排序的一个实现示例:

 1 using System;
 2
 3 namespace Guying.Demo.ConsoleApp
 4 {
 5     class QuickSort
 6     {
 7         static void Main(string[] args)
 8         {
 9             int[] data = new int[] { 1, 1, 4, 3, 6, 7, 4, 5, 0, 0 };  // 建立测试数组
10             Run(data, 0, data.Length - 1);  // 进行快速排序
11             for (int i = 0; i < data.Length; i++)
12                 Console.Write("{0}, ", data[i]);
13             Console.Read();
14         }
15
16         /// <summary>
17         /// 快速排序算法
18         /// </summary>
19         /// <param name="data">排序数组</param>
20         /// <param name="low">排序下限</param>
21         /// <param name="high">排序上限</param>
22         static void Run(int[] data, int low, int high)
23         {
24             /**
25              * 简单设定中间值,并以此为一趟快速排序的分割点
26              * 注意这里是一个简单的算法
27              * 如果想对这个算法进行优化的话,可以采取随机的方法来获取分割点
28              * */
29             int middle = data[(low + high) / 2];
30
31             int i = low, j = high;  // 设定移动上下标
32
33             // 直至分割出两个序列
34             do
35             {
36                 // 扫描中值左边元素
37                 while (data[i] < middle && i < high) i++;
38                 // 扫描中值右边元素
39                 while (data[j] > middle && j > low) j--;
40                 // 找到了一对可交换的值
41                 if (i <= j)
42                 {
43                     // 交换
44                     int temp = data[i];
45                     data[i] = data[j];
46                     data[j] = temp;
47                     i++;
48                     j--;
49                 }
50             } while (i <= j);
51             // 递归对比分割点元素都小的那个序列进行快速排序
52             if (j > low) Run(data, low, j);
53             // 递归对比分割点元素都大的那个序列进行快速排序
54             if (i < high) Run(data, i, high);
55         }
56     }
57 }

  编译并执行上述代码,可以得到如下结果:

说明:

  快速排序算法在最坏的情况下运行时间为O(n2),平均运行时间为O(nlgn)。快速排序的对象都读入内存中,所以输入内部输入内部排序。

  快速排序基于比较关键字来确定元素的位置,所以它属于比较排序。同时,快速排序具有原地排序特性和不稳定特性,这意味着快速排序不需要额外的排序空间,但是不能确保相等的元素位置不被交换。

答案:

  快速排序是最为高效的内部排序算法之一,其基本思想在于把排序对象分割为两列子序列,而其中一个子序列的值都大于另一个子序列的值,并且进一步递归排序所有子序列。

《.NET程序员面试真题》学习笔记

时间: 2024-08-30 06:01:22

面试指南 - 请实现一个快速排序算法的相关文章

用 Java 实现一个快速排序算法

       快速排序是排序算法中效率最高的一种,它是利用递归的原理,把数组无限制的分成两个部分,直到所有数据都排好序为止. 快速排序是对冒泡排序的一种改进.它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 如果要排序的数组是 A[1]--A[N-1],首先任意选取一个数据(通常选用第一个数据)作为中间数据,然后将所有比它小的数都放

[程序员代码面试指南]第9章-蓄水池算法

题目描述 从N个元素中随机抽取k个元素,但的k个数无法事先确定. 在实际应用中,往往会遇到很大数据流的情况.因此,我们无法先保存整个数据流然后再从中选取,而是期望有一种将数据流遍历一遍就得到所选取的元素,并且保证得到的元素是随机的算法. 特别地,此题元素为1-N. 解题思路 蓄水池算法. 先选取个元素中的前k个元素,保存在集合中: 从第i(i>k)个元素开始,每次先以k/i概率选择是否让第i个元素留下.若第i个元素存活,则从集合中k个元素随机扔掉一个,并将该元素放入集合:否则直接扔掉该元素: 重

请写一个算法,用于将list集合内重复元素剔除

package Homework; import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Scanner;/** * list集合是否可以包含重复元素? * 如果可以,请写一个算法,用于将list集合内重复元素剔除. * @author 张致远 * */public class Homework2 { public static void main(String[]

关于快速排序算法(一个90%的人都不懂其原理、99.9%的人都不能正常写出来的算法.)

一.奇怪的现象 研究快速排序很久了,发现一个古怪的实情:这算法描述起来很简单,写一个正确的出来实在不容易.写一个优秀的快速排序算法更是难上加难. 也难怪该算法提出来过了很久才有人写出一个正确的算法,过了很久才优秀的版本出来. 二.原理描述 从数列中挑出一个元素,称为 "基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在这个分区退出之后,该基准就处于数列的中间位置.这个称为分区(partition)操作

[算法]面试时的Java数据结构与算法

查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码.对这两种排序的代码一定要信手拈来才行.还有插入排序.冒泡排序.堆排序.基数排序.桶排序等. 面试官对于这些排序可能会要求比较各自的优劣.各种算法的思想及其使用场景.还有要会分析算法的时间和空间复杂度.通常查找和排序算法

2015Java面试指南(一)

? 前言 2015年可以说是Java程序员的"大年",随着2014年11月乌镇互联网的闭幕,互联网行业是真的迎来了春天.2015年大量的创业型公司的兴起,对Java中高级职位的需求几乎可以用抢人的程度,跳槽人员的薪资普通在30%-50%的涨幅(一方面是因为市场需求.另一方面企业也在努力打破好多年员工待遇倒挂现象,即新入职员工的工资总比老员工高),更高的也不罕见,这是近几年来不曾出现过的. 同时2015年也是Java20岁的生日,Java一路走来,打破了多次"将死"的

代码面试最常用的10大算法

摘要:面试也是一门学问,在面试之前做好充分的准备则是成功的必须条件,而程序员在代码面试时,常会遇到编写算法的相关问题,比如排序.二叉树遍历等等. 在程序员的职业生涯中,算法亦算是一门基础课程,尤其是在面试的时候,很多公司都会让程序员编写一些算法实例,例如快速排序.二叉树查找等等. 本文总结了程序员在代码面试中最常遇到的10大算法类型,想要真正了解这些算法的原理,还需程序员们花些功夫. 1.String/Array/Matrix 在Java中,String是一个包含char数组和其它字段.方法的类

快速排序算法的两个写法

快速排序作为应用比较广泛,而且时间复杂度比较优越的排序算法备受大家的喜爱.最近有点悠闲,就又把这个快速算法研究了一遍,目前掌握了两种排序算法的思路,为了以免忘记,故详细的记录下来,也供大家学习借鉴,不足之处望请指教. 快速排序的基本原理: 假设一个待排序的数组如上图所示,排序的目的就是将其从小到大排序.快速排序的主要步骤就是设定一个待排序的元素(称作主元,记作temp),经过一轮划分排序后在这个主元左边的元素值都小于它,在主元右边的元素值都大于它,一轮划分后的效果应该是这样的,如下图: 这样以t

快速排序算法原理及实现(单轴、三向切分、双轴)

欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. 单轴快速排序的基本原理 快速排序的基本思想就是从一个数组中任意挑选一个元素(通常来说会选择最左边的元素)作为中轴元素,将剩下的元素以中轴元素作为比较的标准,将小于等于中轴元素的放到中轴元素的左边,将大于中轴元素的放到中轴元素的右边,然后以当前中轴元素的位置为界,将左半部分子数组和右半部分子数组看成两个新的数组,重复上述操作,直到子数组的元素个数小于等于1(因为一个元素的数组必定是有