`

快速排序法详解

 
阅读更多

快速排序

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。大概算法是先找到某一元素的确切位置,再把该元素前后分成两半,没找到就移动,找到就赋值!具体做法是先移H,左边找到比val大的就赋值,右边找到比它小的就赋值!L和H赋值(L指向第一个元素,H指向最后一个元素,val存放第一个元素的值)。一旦赋值完就不移动!L和H重合了就不需要找了。只要记住一点就行了:左边找比关键字(val)大的就赋值(没找到就向右移),右边找比关键字(val)小的就赋值(没找到就向左移)。 然后利用递归的思想(排序依次后,对关键字两边执行的操作是一样的)。

举例说明

49 38 65 97 76 13 27 49] //初始关键字
[27 38 13] 49 [76 97 65 49] //第1次划分完成之后,对应递归树第2层
[13] 27 [38] 49 [49 65] 76 [97] //对上一层各无序区划分完成后,对应递归树第3层
13 27 38 49 49 [65] 76 97 //对上一层各无序区划分完成后,对应递归树第4层
13 27 38 49 49 65 76 97 //最后的排序结果

实例代码

#include<stdio.h>
#include<conio.h>
void QuickSort(int *,int,int,int);
int FindPos(int *,int,int);
int num=0;//num用来保存排序进行的趟数
int main()
{
	int arr[]={49,38,65,97,76,13,27,49};
	int i;
	int n=sizeof(arr)/sizeof(int);//用n存放数组长度
	printf("***************** 快速排序算法 ******************\n\n");
	QuickSort(arr,0,n-1,n);//第二个参数表示第一个元素的下标,第三个参数表示最后一个元素的下标
	printf("\n------------- 总共进行了 %d 趟排序!-----------\n",num);
	printf("快速排序后的元素为:");
    for(i=0;i<n;++i)
		printf("%d  ",arr[i]);
	getch();//暂停程序,等待用户输入任意键退出程序
	return 0;
}
/*进行快速排序,确定第一个元素的确切位置,并将元素分成两半,左边一半和右边一半算法相同,*/
void QuickSort(int *a,int low,int high,int n)
{
	int pos=0;
	int i;
	if(low<high)
	{
		pos=FindPos(a,low,high);//确定元素的确切位置
		printf("第%d趟排序后的元素:",++num);
		for(i=0;i<n;++i)
			printf("%d  ",a[i]);
		printf("\n");
		QuickSort(a,low,pos-1,n);//前一半进行排序 
		QuickSort(a,pos+1,high,n);//后一半进行排序
	}
}
int FindPos(int *a,int low,int high)
{
	int val=a[low];//val作为关键字
	while(low<high)//每趟排序都从右边开始
	{
		while(low<high&&a[high]>=val)
			--high;
		a[low]=a[high];
		while(low<high&&a[low]<=val)
			++low;
		a[high]=a[low];
	}//终止while循环之后low和high的值一定是相等的
	a[low]=val;
	return low;
}

运行结果:


注意:

排序算法有3个衡量标准:时间复杂度,空间复杂度,稳定性。稳定性就是能保证排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。比如甲(60)、乙、丙(60)排完序后甲还是在前面就说明这种排序算法稳定,但从运行结果可以看到第3趟和第四趟结果是一样的,这说明快速排序是一种不稳定的排序算法。

结束语

数据结构的学习暂时告一段落,有关数据结构还有很多东西要去学,毕竟数据结构是我们如何存储数据及它们之间的关系(重点) 的一个有力武器,数据结构为我们研究线性和非线性(因为我们的内存是线性一维的,所以通常把非线性结构转化为线性结构来进行存储)问题提供了方便。 明天开始学习算法!

分享到:
评论

相关推荐

    快速排序法C语言详解

    void qsort(int arr[],int left,int right) //qsort()函数实现快速排序,并且是递归调用,而且,递归调用qsort()函数本身两次,因为要对中值两边的 { //部分分别进行排序。arr是待排序的数组名,left是排序的左边界,...

    详解快速排序法--一种比较快的排序方法

    在某些情况下,快速排序法法是最快的一种排序算法,并且它有很大的推广潜力

    经典算法教程 举例详解

    快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 搜寻 循序搜寻法(使用卫兵) 二分搜寻法(搜寻原则的代表) 插补搜寻法 费氏搜寻法 矩阵 稀疏矩阵 多维矩阵转一维矩阵 上三角、下三角...

    数据结构中个各种排序法

    数据结构中个各种排序法,快速,直接插入,冒泡...

    C++快速排序的分析与优化详解

    相信学过数据结构与算法的朋友对于快速排序应该并不陌生,本文就以实例讲述了C++快速排序的分析与优化,对于C++算法的设计有很好的借鉴价值。...和归并排序一样,快速排序也是基于分治法(Divide and conquer

    ACM经典算法 代码+详解

    快速排序法(一) 快速排序法(二) 快速排序法(三) 合併排序法 基數排序法 搜尋 循序搜尋法(使用衛兵) 二分搜尋法(搜尋原則的代表) 插補搜尋法 費氏搜尋法 矩陣 稀疏矩陣 多維矩陣轉一維矩陣...

    详解快速排序算法中的区间划分法及Java实现示例

    主要介绍了详解快速排序算法中的区间划分法及Java实现示例,文中分别介绍了快排时两种区间划分的思路,需要的朋友可以参考下

    各种排序算法完整代码实现.txt

    主要包括冒泡排序(两种思路实现)、冒泡排序的改进算法、选择排序法、插入排序法(两种实现方式)、快速排序法、归并排序法 (递归实现和非递归实现),该资料为本人亲自整理,且代码完整、注释全面!

    php 冒泡排序 交换排序法

    复制代码 代码如下: $a=array(’11’,’2′,’13’,’... 您可能感兴趣的文章:php数组冒泡排序算法实例php冒泡排序与快速排序实例详解又一个PHP实现的冒泡排序算法分享php冒泡排序、快速排序、快速查找、二维数组去重实

    JAVA中运用数组的四种排序方法

    JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法、冒泡法、选择排序法、插入排序法。  快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现。  冒泡法是运用遍历数组进行比较,通过不断...

    python数据结构与算法详解与源码

    5-10 快速排序实现1 (1) 5-10 快速排序实现1 5-11 快速排序实现2 5-12 归并排序 5-13 归并排序 代码执行流程 5-14 归并排序时间复杂度及排序算法复杂度对比 5-15 二分查找 5-16 二分查找时间复杂度 六、树和...

    C程序范例宝典(基础代码详解)

    实例131 快速排序 195 实例132 选择排序 197 实例133 归并排序 198 4.3 查找算法 199 实例134 顺序查找 199 实例135 二分查找 201 实例136 分块查找 202 实例137 哈希查找 203 4.4 定理与猜想 206...

    Articles:文档和源代码。 关于如何开始学习算法和csharp。 如果您具有CC ++或其他编程语言知识,则很容易理解-C language program source code

    介绍 这些文章是我的编程学习笔记。 它们大多数与书籍或网络结合在一起。 别人是我自己的作品。 它们不仅介绍如何获取的逻辑,而且还展示了Java或csharp上的源...算法# 用简单的思维理解归并排序和三向快速排序 12--

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

    入门学习Linux常用必会60个命令实例详解 Linux必学的60个命令 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不...

    考研-数据结构-殷人昆.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 ...

    C++语言描述(PDF合集)

    14.2.3 快速排序 447 14.2.4 选择 452 14.2.5 距离最近的点对 454 14.3 解递归方程 462 14.4 复杂性的下限 463 14.4.1 最小最大问题的下限 464 14.4.2 排序算法的下限 465 第15章 动态规划 467 15.1 算法思想 467 ...

    Excel公式大全操作应用实例(史上最全)

    IF函数替换法总结 查找的函数(查找末位词组) 怎样从原始数据中自动获取最后一个数据 两列数据查找相同值对应的位置 查找数据公式两个(基本查找函数为VLOOKUP,MATCH) 【输入数据的技巧】 谈谈Excel输入的技巧 一列...

    asp.net知识库

    分页存储过程:排序反转分页法 优化后的通用分页存储过程 sql语句 一些Select检索高级用法 SQL server 2005中新增的排序函数及应用 根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【算法】快速排序 142 【算法】归并排序的过程?时间复杂度?空间复杂度? 143 【算法】什么是一致性哈希?用来解决什么问题? 144 【性能优化】页面静态化 144 【设计模式】写一个单例(延迟加载,高性能) 144 【容器...

    Hibernate实战(第2版 中文高清版)

    第一部分 从Hibernate和EJB 3.0开始  第1章 理解对象/关系持久化   1.1 什么是持久化   1.1.1 关系数据库   1.1.2 理解SQL   1.1.3 在Java中使用SQL   1.1.4 面向对象应用程序中的持久...附录B 映射快速参考

Global site tag (gtag.js) - Google Analytics