关闭

优化排序之快速排序

216人阅读 评论(48) 收藏 举报

【前言】:
最近小组一起讨论了三种基础排序:选择排序、冒泡排序、插入排序,以及他们的优化堆排序,快速排序、希尔排序,现在由小编分享一下快速排序;

【内容】:

1.快速排序的思想:
      快速排序的思想归纳起来有的三步:
      第一步:任意选取序列中的一个元素,用此元素作为“中间元素”,这里说明一下,这个“中间元素”,排序后不一定刚好在序列的中间。
     第二步:在序列中取出所有大于“中间元素”的元素,放在“中间元素”的右边。
    第三步:在序列中取出所有小于“中间元素”的元素,放在“中间元素”的左边。
经过这三步后便完成了一轮排序。
2、递归调用
     经过一轮排序后,序列一般被“中间元素”分成两部分,一部分比“中间元素”小,另一部分反之。所以我们要继续排序剩下的两部分,所以我们要理解递归

的思想,只要我们继续利用以上的三步,排序剩下的两部分,最终便会排序完整个序列。

【实例】:

下面是我用c#进行的实例,跟大家交流一下;

       

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

namespace 快速排序
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入待排序数列(以\",\"分割):");
string _s = Console.ReadLine();
string[] _sArray = _s.Split(",".ToCharArray());
int _nLength = _sArray.Length;
int[] _nArray = new int[_nLength];
for (int i = 0; i < _nLength; i++)
{
_nArray[i] = Convert.ToInt32(_sArray[i]);
}

var list = _nArray.ToList();
QuickSort(list, 0, _nLength - 1);

foreach (var i in list)
{
Console.WriteLine(i.ToString());
}
while (true)
{
// Thread.Sleep(10000);
}
}
//获取按枢轴值左右分流后枢轴的位置
private static int Division(List<int> list, int left, int right)
{
while (left < right)
{
int num = list[left]; //将首元素作为枢轴
if (num > list[left + 1])
{
list[left] = list[left + 1];
list[left + 1] = num;
left++;
}
else
{
int temp = list[right];
list[right] = list[left + 1];
list[left + 1] = temp;
right--;
}
Console.WriteLine(string.Join(",", list));
}
Console.WriteLine("--------------\n");
return left; //指向的此时枢轴的位置
}
private static void QuickSort(List<int> list, int left, int right)
{
if (left < right)
{
int i = Division(list, left, right);
//对枢轴的左边部分进行排序
QuickSort(list, i + 1, right);
//对枢轴的右边部分进行排序
QuickSort(list, left, i - 1);
}
}
}
}


【前言】:
最近小组一起讨论了三种基础排序:选择排序、冒泡排序、插入排序,以及他们的优化堆排序,快速排序、希尔排序,现在由小编分享一下快速排序;
【内容】:
1.快速排序的思想:
快速排序的思想归纳起来有的三步:
第一步:任意选取序列中的一个元素,用此元素作为“中间元素”,这里说明一下,这个“中间元素”,排序后不一定刚好在序列的中间。
第二步:在序列中取出所有大于“中间元素”的元素,放在“中间元素”的右边。
第三步:在序列中取出所有小于“中间元素”的元素,放在“中间元素”的左边。
经过这三步后便完成了一轮排序。
2、递归调用
经过一轮排序后,序列一般被“中间元素”分成两部分,一部分比“中间元素”小,另一部分反之。所以我们要继续排序剩下的两部分,所以我们要理解递归
的思想,只要我们继续利用以上的三步,排序剩下的两部分,最终便会排序完整个序列。
0
0
查看评论

数据结构实验之排序八:快速排序 递归

Time Limit: 1000MS Memory Limit: 65536KB Problem Description 给定N(N≤10^5)个整数,要求用快速排序对数据进行升序排列,注意不得使用STL。 Input 连续输入多组数据,每组输入数据第一行给出正整数N(≤10^5),随后给...
  • khn64
  • khn64
  • 2017-02-08 19:22
  • 193

快速排序及优化(三路划分等)

快速排序, 是最经典的排序算法之一。快速排序拥有良好的时间复杂度,平均为O(nlog2n)O(nlog_{2}n),最差为O(n2)O(n^2)。在这里,我们不妨略略深入讨论一下快速排序:时间复杂度分析首先说平均时间复杂度。以比较常用的从两头进行扫描的算法为例,算法主要分两步: 1. 是快排的核心...
  • puppylpg
  • puppylpg
  • 2017-04-19 00:36
  • 1513

数据结构实验之排序八:快速排序 (sdut oj)

数据结构实验之排序八:快速排序 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 给定N(N≤10^5)个整数,要求用快速排序对数据进行升序排列,注意不得使...
  • SwordsMan98
  • SwordsMan98
  • 2017-04-21 16:46
  • 197

使用插入排序优化快速排序的算法实现

实验目的:       快速排序可以按照以下的算法思想优化,并加快快速排序的速度:即当快速排序所划分的子序列的长度小于某个定值k时,该子序列基本有序,可以采用插入排序的办法对子序列进行排序,从而使整体算法的时间复杂度的期望下降为O(nk+n...
  • icyfire0105
  • icyfire0105
  • 2008-01-26 10:46
  • 3470

六大经典排序算法 java 选择排序、插入排序、冒泡排序、快速排序、堆排序、归并排序,六大经典排序算法,

1. [文件] ChaRuFa.java ~ 890B     下载(71)      ? 1 2 3 4...
  • Smurfs___zmy
  • Smurfs___zmy
  • 2016-11-04 08:54
  • 506

几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)

最近决定每天学点数据结构与算法,写博客来督促自己继续学习~ 以下的每个排序的写法格式基本按照先介绍基本思想,再描述具体过程,最后是具体代码。关于复杂度等问题后续更新。如有写的不严谨的地方,欢迎指出,相互交流。 希尔排序 基本思想:将一组数据按照一定的步长分组,进行直接插入排序,然后再缩...
  • zouliping123
  • zouliping123
  • 2013-04-25 15:10
  • 2033

lintcode 整数排序 1和2

package cn.edu.tju.cs.bigdata.chc; public class 整数排序1 { /** * @author 小锦囊 * 冒泡排序 */ public void sortIntegersMaoPao(int[] A){ for(int i = ...
  • u014470581
  • u014470581
  • 2016-10-16 15:53
  • 622

快速排序及优化(Java版)

快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。 一次快速排序详细过程: 选择数组第一个值作为枢轴值。 代码实现:package QuickSort;public class QuickSortRealize { public...
  • scgaliguodong123_
  • scgaliguodong123_
  • 2015-06-12 20:56
  • 2855

数据结构实验之排序一:一趟快排

数据结构实验之排序一:一趟快排 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定N个长整型范围内的整数,要求输出以给定数据中第一个数为枢轴进...
  • guoqingshuang
  • guoqingshuang
  • 2015-12-20 19:01
  • 2385

【数据结构与算法】内部排序之四:归并排序和快速排序(含完整源码)

之所以把归并排序和快速排序放在一起探讨,很明显两者有一些相似之处:这两种排序算法都采用了分治的思想。下面来逐个分析其实现思想。 归并排序 实现思想 归并的含义很明显就是将两个或者两个以上的有序表组合成一个新的有序表。归并排序中一般所用到的是2-路归并排序,即将含有n个元素...
  • mmc_maodun
  • mmc_maodun
  • 2014-03-06 00:02
  • 7419
    个人资料
    • 访问:21107次
    • 积分:4865
    • 等级:
    • 排名:第6996名
    • 原创:69篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1992条
    最新评论