`

数据结构-排序: 交换排序(快速排序法)

阅读更多

数据结构-排序: 交换排序(快速排序法)

1、算法思想
 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

(1) 分治法的基本思想
 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

(2)快速排序的基本思想
 设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:
①分解:
 在 R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos- 1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字 pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无 须参加后续的排序。
注意:
 划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为(注意pivot=R[pivotpos]):
 R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys
其中low≤pivotpos≤high。
②求解:
 
通过递归调用快速排序对左、右子区间R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。
③组合:
 因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作。

2、快速排序算法QuickSort

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

namespace ExQuickSorter
{
class QuickSorter
{
private void swap(ref int l, ref int r)
{
int temp;
temp = l;
l = r;
r = temp;
}
public void Sort(int[] list, int low, int high)
{
int pivot;//存储分支点
int l, r;
int mid;
if (high <= low)
return;
else if (high == low + 1)
{
if (list[low] > list[high])
swap(ref list[low], ref list[high]);
return;
}
mid = (low + high) >> 1;
pivot = list[mid];
swap(ref list[low], ref list[mid]);
l = low + 1;
r = high;
do
{
while (l <= r && list[l] < pivot)
l++;
while (list[r] >= pivot)
r--;
if (l < r)
swap(ref list[l], ref list[r]);
} while (l < r);
list[low] = list[r];
list[r] = pivot;
if (low + 1 < r)
Sort(list, low, r - 1);
if (r + 1 < high)
Sort(list, r + 1, high);
}

static void Main(string[] args)
{
int[] iArrary = new int[] { 1, 5, 3, 6, 10, 55, 9, 2, 87, 12, 34, 75, 33, 47 };
QuickSorter q = new QuickSorter();
q.Sort(iArrary, 0, 13);
for (int m = 0; m <= 13; m++)
Console.WriteLine("{0}", iArrary[m]);
}
}
}

分享到:
评论

相关推荐

    数据结构排序算法汇总包-直接插入排序 折半插入排序 2—路插入排序 表插入排序 希尔排序 起泡排序 快速排序 简单选择排序 树形选择排序 堆排序 归并排序链式基数排序

    实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...

    数据结构中排序总结:冒泡、交换、选择、插入、基数、Shell、快速、归并、堆

    数据结构中排序总结:冒泡、交换、选择、插入、基数、Shell、快速、归并、堆

    考研-数据结构-殷人昆.zip

    8.3.2 快速排序 241 8.4 选择类排序 243 8.4.1 简单选择排序 243 8.4.2 堆排序 244 8.5 二路归并排序 247 8.6 基数排序 248 8.7 外部排序 252 8.7.1 概念与流程 252 8.7.2 置换-选择排序 253 8.7.3 佳归并树 254 ...

    数据结构内排序源代码

    一趟快速排序的具体做法是:附设两个指针low和high,它们的初值分别指向数组第一个数据和最后一个数据,将枢轴记录暂存在R[0]的位置上排序过程中只作R[low]或R[high]的单向移动,直至一趟排序结束后再将枢轴记录移至...

    数据结构 排序算法的比较

    排序是计算机程序设计中的一种重要...插入排序类、交换排序类、选择排序类、归并排序类和基数排序类。算法主要包括:插入排序、折半插入排序、选择排序、冒泡排序、希尔排序、快速排序、堆排序、归并排序、基数排序等。

    leetcode中国-Algorithm-and-Data-Structure:算法与数据结构之道

    改进快速排序以防止重复。 使插入排序与归并排序的交换实现兼容。 实现字符串类。 实现矢量模板。 通过节点类继承系统实现表达式计算器。 . 力码? 贡献 是时候从所有这些......东西中进行选择了!

    数据结构实验报告--多关键字排序.doc

    直接插入排序,希尔排序,简单选择排序,冒泡排序,快速排序,堆排序,归并排序主要通过某种策略移动,选择或交换关键字来实现,关键字选择上,为了简便起见,都是整形数据。关键字间的比较,也都是直观的大小比较。...

    数据结构排序2

    希尔排序 交换排序:冒泡排序,快速排序 选择排序:简单选择排序,堆排序

    数据结构里的排序问题

    本资源比较全面的包涵了各种排序,三种交换排序,选择排序,桶排序,归并排序,快速排序,二分法排序,等等

    交换排序\快速排序

    数据结构的快速排序法!是基础的东西,望大家多多支持!

    java二分法排序源码-Article:十大经典排序算法动画,看我就够了!

    排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序。 内部排序是数据记录在内存中进行排序。 而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要...

    入门学习Linux常用必会60个命令实例详解doc/txt

    因为Linux与Windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失,使系统处于不稳定的状态,甚至在有的系统中会损坏硬件设备(硬盘)。在系统关机前使用 shutdown命令,系统管理员会通知所有...

    Leetcode扑克-MyDataStruct:数据结构学习记录

    学习数据结构和算法,了解其基本原理的同时,离不开编码实现,于是,尽力实现所学内容。 除此之外,在leetcode平台上,做一些算法题,一是巩固自己所学内容,二是强化自己的算法思想,三是查漏补缺。 项目结构 ...

    数据结构排序算法介绍

    数字排序法:通常来说有五大类方法:插入排序(直接插入排序、希尔排序等)、交换排序(冒泡排序、快速排序)、选择排序(简单选择排序、树形选择排序、堆排序)、归并排序、基数排序

    数据结构实验快速排序.doc

    实 验 报 告 实验名称 排序 课程名称 数据结构与算法实验 " " 专业班级:信息安全 学 号: 姓 名: 实验目的 掌握快速排序 实验内容 1、快速排序 编写程序,实现快速排序。从键盘上输入10个整数,存放在数组中,然后...

    leetcode下载-algorithm:算法数据结构学习

    算法数据结构学习 (对应LeetCode编号) 时间复杂度 是否稳定排序 是否原地排序 冒泡怕排序 O(n^2) 是 是 插入排序 O(n^2) 是 是 选择排序 O(n^2) 否 是 快速排序 O(n*logn) 否 是 归并排序 O(n*logn) 是 否 计数排序 ...

    精心整理史上最全的数据结构flash演示动画,共5个版本,祝大家考研成功!

    \数据结构flash演示\版本2\10.3 交换排序-冒泡排序.swf \数据结构flash演示\版本2\10.3 快速排序.swf \数据结构flash演示\版本2\10.4.3 堆排序-删除.swf \数据结构flash演示\版本2\10.4.3 堆排序-插入.swf \数据...

    内部排序算法比较 数据结构课程设计

    1、本演示程序对以下6种常用的内部排序算法进行实测比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。 2、待排序表的表的元素的关键字为整数,表长不小于100;其中的数据要用伪随机数产生...

    数据结构8种排序算法动态演示

    使用MFC单文档实现数据结构8种排序算法的图形界面动态演示,更加形象的展示排序过程,八种排序算法包括插入排序(直接插入排序、折半插入排序、希尔排序)、选择排序(直接选择排序、堆排序)、交换排序(冒泡排序、...

    数据结构实践:10个核心课程设计实例,包括二叉树、排序算法

    3. **快速排序**:一种分治算法,通过选择一个“基准”值将数据分为两部分,一部分数据比基准值小,另一部分数据比基准值大,然后递归地对这两部分数据进行快速排序操作。 此外,该资源包还可能包含其他经典的数据...

Global site tag (gtag.js) - Google Analytics