`
kingj
  • 浏览: 421321 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

算法导论学习之第七章-快速排序

 
阅读更多

      快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

      不说废话,我们先看代码,然后举个具体例子进行分析。


package chapter7;

import java.util.Arrays;

public class QuickSort {
	public void sort(int a[],int l,int r){
		if(l<r){
			int q=partition1(a,l,r);
			sort(a,l,q);
			sort(a,q+1,r);
		}
	}
	
	public void sort(int a[]){
		sort(a,0,a.length-1);
	}
	
	private int partition1(int a[],int i,int j)
	{
		int key=a[(i+j)/2];
		while(i<j){
			
			while(i<j&&a[i]<key){
				i++;
			}
			
			while(i<j&&a[j]>key){
				j--;
			}
			
			if(i<=j){
				swap(a,i,j);
				j--;
			}
		}
		//System.out.printf("(key=%d,i=%d,j=%d\n,array=%s)\n",key,i,j,Arrays.toString(a));
		return i;
	}
	

	private void swap(int[] a, int i, int j) {
		int t=a[i];
		a[i]=a[j];
		a[j]=t;
	}

	
	
	public static void main(String[] args) {
		int a[]={8,5,7,2,19,3};
		System.out.println("Before "+Arrays.toString(a));
		QuickSort qs=new QuickSort();
		qs.sort(a);
		System.out.println("After "+Arrays.toString(a));
	}
}

 

  对于数组A[0,r]存在分割点p,使得A[0,p]有序,同时A[p+1,r]有序,并且A[0,p]<=A[p]<=A[p+1,r] 。

 

  我们来看看数组a=[8,5,7,2,19,3]是如何进行快速排序的。

   具体代码:

 

private int partition1(int a[],int i,int j)	
{
		int key=a[(i+j)/2];
		while(i<j){
			
			while(i<j&&a[i]<key){
				i++;
			}
			
			while(i<j&&a[j]>key){
				j--;
			}
			
			if(i<=j){
				swap(a,i,j);
				j--;
			}
		}
		//System.out.printf("(key=%d,i=%d,j=%d\n,array=%s)\n",key,i,j,Arrays.toString(a));
		return i;
	}
 
  • 获取分割点坐标值i
  • 对a[0,i]和a[i+1,length]进行递归排序
      令key=a[2]=7

      第一趟获取分割点:
  1.  i=0,j=5,  a[i]=8,a[j]=3,key=7,因为a[i]>key同时a[j]<key 直接交换i,j的值,j向数组左移动 数组A=[3,5,7,2,19,8]
  2.  i=0,j=4,  a[i]=3,a[j]=19,key=7  a[i]<key 那么指针i向右移动 知道i=2
  3.  i=2,j=4,  a[i]=7,a[j]=19,key=7 a[i]=key同时a[j]>key ,指针i不移动,指针j继续向左移动
  4.  i=2,j=3,  a[i]=7,a[j]=2 ,key=7  a[i]=key同时a[j]<key,因此指针i不移动,指针j继续向左移动,同时交换i,j的值,此时A=[3,5,2,7,19,8]
  5.  i=2,j=2 跳出循环,返回分割点的值为i=2 即完成第一趟分割 。此时A=[3,5,2,7,19,8]
  6. 由于i=j=2,结束递归条件,函数执行完成。
     第二趟获取分割点:
  1. 此时快速排序递归调用sort(a,0,p) ,p=2 ,获取数组A‘=[3,5,2]
  2. i=0,j=2,Key=a[1]=5  因为a[i]=3<5 因此 指针i向右移动直到i=1,此时j=2
  3. i=1,j=2,key=5, a[i]=5,a[j]=2 ,因为a[j]<key,因此交换i,j的值,并将指针j向左移动,此时A’=[3,2,5],A=[3,2,5,7,19,8]
  4. i=1,j=1,跳出循环,返回分割点的值为i=1,完成第二趟分割。此时A=[3,2,5,7,19,8]
  5. 由于i=j=1,结束递归条件,函数执行完成。
    第三趟获取分割点:
  1. 此时快速排序递归调用sort(a,0,p),p=1,令数组A2=[3,2]
  2. i=0,j=1 key=a[0]=3 a[i]=3=key,所以指针i不移动,a[j]=2<key,因此需要交换i,j的值,然后将指针j向左移动,此时A2=[2,3]
  3. i=0,j=0 跳出循环,返回分割点的值为i=0,完成第三趟分割。此时A=[2,3,5,7,19,8]
  4. 由于i=j=0,结束递归条件,函数执行完成。
   第四趟获取分割点:
  1. 此时快速排序递归调用sort(a,p+1,r),p=2,令数组A3=[19,8]
  2. i=4,j=5 ,key=a[4]=19,a[i]=19,因为a[i]=key,因此指针i不移动,a[j]=8<key,因此需要交换i,j的值,同时j向做移动。此时A3=[8,9]
  3. i=4,j=4 跳出循环,返回分割点i=4,完成第四趟获取分割点。此时A=[2,3,5,7,8,19]
  4. 由于i=j=4,结束递归条件,函数执行完成。    

 

     由此我们可以很清晰的知道快速排序的工作原理,关键函数是获取分割点,同时应该注意边界问题。

    欢迎各位拍砖


分享到:
评论

相关推荐

    算法导论-麻省理工(中文)

     第七章 快速排序(Quicksort)  第八章 线性时间中的排序(Sorting in Linear Time)  第九章 中值与顺序统计(Medians and Order Statistics)  第三部分(Part III) 数据结构(Data Structures)  第十章 ...

    算法导论 第二版 (完整版)

    第7章 快速排序 第8章 线性时间排序 第9章 中位数和顺序统计学 第三部分 数据结构 第10章 基本数据结构 第11章 散列表 第12章 二叉查找树 第13章 红黑树 第14章 数据结构的扩张 第四部分 高级设计和分析技术 导论 第...

    算法导论-第三版(中文).rar

    第七章快速排序(Quicksort) 第八章 线性时间中的排序(Sorting in Linear Time) 第九章 中值与顺序统计(Medians and Order Statistics) 第三部分(Part III) 数据结构(Data Structures) 第十章 基本的...

    算法导论(第2版)参考答案

     第七章 快速排序(Quicksort)  第八章 线性时间中的排序(Sorting in Linear Time)  第九章 中值与顺序统计(Medians and Order Statistics)  第三部分(Part III) 数据结构(Data Structures)  第十...

    算法导论(part2)

    ·快速排序(第7.1节)中用到的划分方法与期望线性时间顺序统计算法(expected linear-time order-statistic algorithm,第9.2节)有所变化。现在,我们采用了Lomuto提出的方法,并将该方法与指示器随机变量一起使用,...

    算法导论中文版

    第7章 快速排序  7.1 快速排序的描述  7.2 快速排序的性能  7.3 快速排序的随机化版本  7.4 快速排序分析  7.4.1 最坏情况分析  7.4.2 期望运行时间  思考题  本章注记 第8章 线性时间排序  8.1 ...

    算法导论(英文版)

    第七章 快速排序(Quicksort) 第八章 线性时间中的排序(Sorting in Linear Time) 第九章 中值与顺序统计(Medians and Order Statistics) 第三部分(Part III) 数据结构(Data Structures) 第十章 基本的...

    算法导论 第二版

    第7章 快速排序 第8章 线性时间排序 第9章 中位数和顺序统计学 第三部分 数据结构 第10章 基本数据结构 第11章 散列表 第12章 二叉查找树 第13章 红黑树 第14章 数据结构的扩张 第四部分 高级设计和分析技术 导论 第...

    算法导论(第二版 中文高清版)

    第7章 快速排序 第8章 线性时间排序 第9章 中位数和顺序统计学 第三部分 数据结构 第10章 基本数据结构 第11章 散列表 第12章 二叉查找树 第13章 红黑树 第14章 数据结构的扩张 第四部分 高级设计和分析技术 导论 第...

    算法导论(part1)

    ·快速排序(第7.1节)中用到的划分方法与期望线性时间顺序统计算法(expected linear-time order-statistic algorithm,第9.2节)有所变化。现在,我们采用了Lomuto提出的方法,并将该方法与指示器随机变量一起使用,...

    MIT_Introduction to Algorithms 算法导论视频字幕

    11 第七课 散列,通用散列 阅读: 11 章 1 到 3 节 收《作业 3》发《作业 4》 12 第八课 散列函数,完美散列 阅读:11 章第 5 节 13 演示课 5 测验 1 复习 收《作业 4》 14 评分后的作业4可以在中午拿到 15 测验...

    算法导论第三版英文原版

    第七章 快速排序(Quicksort) 第八章 线性时间中的排序(Sorting in Linear Time) 第九章 中值与顺序统计(Medians and Order Statistics) 第三部分(Part III) 数据结构(Data Structures) 第十章 基本的数据...

    算法导论(中文 第二版)答案

     第七章 快速排序(Quicksort)  第八章 线性时间中的排序(Sorting in Linear Time)  第九章 中值与顺序统计(Medians and Order Statistics)  第三部分(Part III) 数据结构(Data Structures)  第十...

    算法导论(原书第二版)

    第七章快速排序(Quicksort) 第八章 线性时间中的排序(Sorting in Linear Time) 第九章 中值与顺序统计(Medians and Order Statistics) 第三部分(Part III) 数据结构(Data Structures) 第十章 基本的数据...

    算法导论Introduction to Algorithms

    第七章快速排序(Quicksort) 第八章 线性时间中的排序(Sorting in Linear Time) 第九章 中值与顺序统计(Medians and Order Statistics) 第三部分(Part III) 数据结构(Data Structures) 第十章 基本的数据...

    算法导论Introduction.to.Algorithms,.Second.Edition.part2(英文)

     第七章 快速排序(Quicksort)  第八章 线性时间中的排序(Sorting in Linear Time)  第九章 中值与顺序统计(Medians and Order Statistics)  第三部分(Part III) 数据结构(Data Structures)  第十章 ...

    算法导论Introduction.to.Algorithms,.Second.Edition.part1(英文版)

     第七章 快速排序(Quicksort)  第八章 线性时间中的排序(Sorting in Linear Time)  第九章 中值与顺序统计(Medians and Order Statistics)  第三部分(Part III) 数据结构(Data Structures)  第十章 ...

    计算机算法设计与分析

    第七章 分支定界法:算法思想、装箱问题、0/1 背包问题、旅行商问题、电路板排列等实例分析。 第八章 NP-难度问题和NP-完全问题简介,证明NP 完全性的方法介绍。 主要参考书: 1. 余祥宣等,《计算机算法基础...

Global site tag (gtag.js) - Google Analytics