`
java--hhf
  • 浏览: 309345 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

数组排序之快速排序

阅读更多

        据大家所知的,快速排序是目前的一种非常快的排序方法,它是由C. A. R. Hoare在1962年提出。它的基本思想是:选择一个中间key值,作为分蘖点。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比key小,另外一部分的所有数据都要比key大,然后再递归调用按此方法对这两部分数据分别进行快速排序,以此达到整个数据变成有序序列。

      我们先来看一下具体的思路,再根据思路成型代码。

下面是我的程序运行结果截图:

快速排序

 

        我选择key的方法是(0 + array.length)/2。

    因此,第一次选择“93”作为key所对应的值,第一次排序开始。比93小的四个数到了93的左边,比93大的两个数排到93的右边。

    现在整个数组被分成了三块:比93小、93,比93大。容易想到下面进行递归调用,分别对93前后两大块进行快速排序。此时的93已经到了自己正确的次序位子。这里会有两个递归调用,先左还是先右完全由读者自己定。这里我选择了先左后右。

     于是,第二次排序开始,到了93的左边四个数。选择68作为key对应的值。63,58相应的到了68左边,92到了68的右边。

     第三次排序时到了68的左边,选择第一个元素58作为key对应的值,显然不需要交换任何值。

     第四次排序时转到68的右边,因为只有92一个元素,不再需要排序。因此再继续向右走,来到93的右边。选择这一块中的第一个元素98作为key对应的值,将比98小的95移动到98的左边。

     到这里我们的快速排序结束。

     下面就到了代码部分。快速排序的代码有些技巧,需要我们格外的注意其中变量之间的关系和调用函数时的值传递问题。在上传的代码里我也会尽量多的添加注释,读者想要了解、理解、掌握快速排序,就还需要细细体会了。

package hhf.Sort_1012;

import java.util.Random;

/**
 * 快速排序
 * @author Administrator
 * 2012年11月25日
 */
public class QuickSort {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//生成一个随机的数组,它有5~20随机的长度,随机的0~99的值
		Random random = new Random();
		int num = 5 + random.nextInt(16);
		int[] array = new int[num];
		for(int i = 0 ; i < num ; i++)
			array[i] = random.nextInt(100);
		System.out.println("一共有元素   " + num + "  个");
		//打印原来未排序数组
		System.out.println("未排序前");
		print(array);
		//开始排序
		System.out.println("排序中======>>>========>>>>>========>>>");
		quicksort(array,0,array.length - 1);
		//排序后再打印
		System.out.println("已排序后");
		print(array);
	}
	/**
	 * 快速排序的代码实现
	 * @param j 数组的末尾
	 * @param i 数组的起始
	 * @param array数组名
	 */
	private static void quicksort(int[] array, int i, int j) {
		//System.out.println("quicksort中i = " + i);
		//System.out.println("quicksort中j = " + j);
		//这是一个递归函数 首先判断是否递归调用截止(当当前块只有一个元素的时候就不需要再排序了)
		if(j <= i) 
			return;
		//得到一个关键码key
		int key = (j + i) / 2;
		//System.out.println("quicksort中key = " + key);
		//将关键码key与最后一个数array[length - 1]交换,可以使排序变得方便
		swap(array,key,j);
		//将前length-1个数进行分类 ——小于key的在前,大于key的在后,并返回大于key的那一块的第一个元素的地址k
		int k = sort(array,i-1,j,j);
		//System.out.println("quicksort中k = " + k);
		//交换k和key是key到达自己应该到的位置
		swap(array,k,j);
		//递归调用自己 现在已经将原数组分为了两块[0~ key-1]和[key+1 ~ length]因而就要调用两次
		print(array);//打印出来,看一下
		quicksort(array,i,k-1);
		quicksort(array,k+1,j);
	}
	/**
	 * 实现分类的函数,其结果是使得比key小的数放在前面 大于key的数放在后面
	 * @param array数组名
	 * @param i 数组起始的前一个位置
	 * @param j 数组结尾
	 * @param key 关键码
	 * @return大于key的数的第一个元素下标
	 */
	private static int sort(int[] array, int i, int j, int key) {
		//System.out.println("sort中i0 = " + i);
		//System.out.println("sort中j = " + j);
		do{
			//取到应该交换的i j值
			while(array[++i] < array[key]);
			while(j>0 && array[--j] >= array[key]);
			//交换array[i]和array[j]
			swap(array,i,j);
		}while(j>i);
		//因为最后会有一次多余的i,j交换,所以我们要再人为的交换回来
		swap(array,i,j);	
		//System.out.println("sort中i1 = " + i);
		//返回大于key0的第一个元素下标
		return i;
	}
	/**
	 * 交换array里面的array[i]和array[j]
	 * @param array
	 * @param i
	 * @param j
	 */
	private static void swap(int[] array, int i, int j) {
		int temp = array[i];
		array[i] = array[j];
		array[j] = temp;
	}
/**
 * 打印数组
 * @param array数组名
 */
	private static void print(int[] array) {
		for(int i = 0 ;i < array.length ; i++)
			System.out.print(array[i]+"\t");
		System.out.println();			
	}

}


//double d = 5 + r.nextInt(5) + r.nextDouble();
//可以得到最小为5,最大为10的浮点数。
//解释:public int nextInt(int n)返回一个伪随机数,它是从此随机数生成器的序列中取出的、
//在 0(包括)和指定值(不包括)之间均匀分布的 int值。
//public double nextDouble()返回下一个伪随机数,
//它是从此随机数生成器的序列中取出的、在0.0d(包括)到 1.0d(包括)范围内均匀选择(大致)的 double 值。 

 

    代码不是很长,就只是有点复杂(⊙o⊙),理解就好,理解就好。 在结尾的时候我外加了一点关于随机函数的使用技巧。

    最后呢,希望读者自己将代码写一遍,为了更好的掌握与体会。

 

分享到:
评论

相关推荐

    易语言自定义数据类型数组排序

    常见的排序算法有冒泡排序、选择排序、插入排序、快速排序等。易语言中可以使用内置的“排序数组”命令,但可能需要提供比较函数来处理自定义数据类型。 ```易语言 .子程序 比较产品, 产品, 产品 如果 第1个参数....

    VB.NET二维数组快速排序(更新)

    VB.NET二维数组快速排序(更新) 'OldArrays(),为排序二维数组;NewArrays(),为存放结果数组,SortColumnsOrOrders(),传递排序参数数组,偶数个为排序列号,奇数为升降序,0为升序,1为降序;FieldRow,是否有字段行...

    使用快速排序法对一维数组进行排序

    然后对这两个子数组递归地进行快速排序,最终达到整个数组有序的目的。 快速排序的步骤如下: 1. **选择基准**:从待排序的数组中选取一个元素作为基准(pivot)。 2. **分区操作**:重新排列数组,使得所有小于...

    易语言数组排序源码.zip

    在"易语言数组排序源码.zip"这个压缩包中,我们可以期待找到一些关于易语言如何实现数组排序的示例代码。数组排序是计算机科学中的基础操作,它在各种算法和数据处理中都有着广泛的应用。 数组排序通常涉及两种主要...

    js对象数组按属性快速排序

    按所推荐的程序在IE下跑了下,的确,排序耗时很小。 代码如下: [removed] /* * 洗牌 */ function ... /* * 快速排序,按某个属性,或按“获取排序依据的函数”,来排序. * @method soryBy * @static * @

    易语言数组排序算法集合

    本资源“易语言数组排序算法集合”提供了多种常见的排序算法的源代码实现,对于学习易语言以及算法理解都有极大的帮助。下面将详细介绍其中提及的几种排序算法。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之...

    c语言的基本算法 数组排序

    其他常见的排序算法还包括冒泡排序、插入排序、快速排序、归并排序等,每种都有其适用的场景和优缺点。在实际编程中,根据数据规模、稳定性、空间复杂度等因素选择合适的排序算法至关重要。对于C语言初学者,理解并...

    文本数组排序模块测试程序

    在IT行业中,数组排序是一个非常基础且重要的概念,特别是在编程领域。数组是数据结构的一种,它存储一组相同类型的元素,并且这些元素可以通过索引进行访问。排序则是将数组中的元素按照特定规则(如升序或降序)...

    VB070-数组排序 源代码

    在编程领域,数组排序是一个非常基础且重要的概念,尤其在Visual Basic (VB)中,它在数据处理和算法实现上扮演着关键角色。本资源"VB070-数组排序 源代码"提供了一组关于如何在VB环境中对数组进行排序的源代码示例,...

    易语言文本数组排序模块测试程序源码,易语言文本数组排序模块源

    排序算法可以采用经典的冒泡排序、选择排序、插入排序、快速排序、归并排序等,或者更高效的算法如堆排序、希尔排序等。 在"易语言文本数组排序模块源码"中,我们可以学习到如何实现这些排序算法。源码分析可以帮助...

    matlab数组排序方法.docx

    在 MATLAB 中,数组排序是一个非常常见的操作,尤其在数据分析和科学计算中。MATLAB 提供了多种内置函数来满足不同的排序需求。以下是一些主要的排序方法及其详细说明: 1. **sort 函数**: - `sort(A)`:对一维...

    oc中数组排序

    对于大量数据,快速排序或归并排序算法可能更为高效。Objective-C的`sortUsingComparator:`方法内部可能会使用这些高级排序算法,但具体实现取决于系统。 六、实践应用 为了更好地复习和巩固OC中的数组排序,可以...

    易语言数组快速排序

    在易语言中实现数组的快速排序是提高程序效率的重要技术之一。快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出,它的基本思想是分治策略。 快速排序的基本步骤如下: 1. **选择基准...

    数组排序知识代码(c#)

    数组排序的方法有很多种,包括但不限于冒泡排序、选择排序、插入排序、快速排序、归并排序以及C#框架提供的`Array.Sort()`方法。 **插入排序**是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未...

    flex 数组排序

    ### Flex 数组排序知识点 #### 一、简介 在Flex开发中,经常需要对数组进行排序,特别是当处理复杂的二维数组或对象数组时。本文将详细介绍如何使用Flex中的`sortOn`方法对数组进行排序,并给出具体的代码示例。 ...

    c++数组排序

    在IT行业中,数组排序是基础且重要的编程技能之一,尤其在C++中。数组作为一种基本的数据结构,常常需要进行各种排序操作,以便于数据分析、处理和查找。本篇将深入探讨几种经典排序算法,这些算法不仅理论性强,...

    易语言字节型数组排序

    4. 快速排序:采用分治策略,选取一个基准元素,将数组分为小于基准和大于基准的两部分,再对这两部分递归进行快速排序。易语言实现快速排序需要递归函数,以及分区和交换元素的操作。 在实际应用中,为了提高性能...

    随机数排序_20个随机数_数组排序_源码

    以上就是针对"随机数排序_20个随机数_数组排序_源码"这一主题的关键知识点,涵盖了随机数生成、数组操作、排序算法及其性能、源码分析等方面。理解这些概念对于提升编程技能和解决问题能力非常有帮助。

    无序数组排序

    在IT领域,数组排序是一个基础且重要的主题,尤其在数据结构和算法的学习中。无序数组排序是指对一个没有特定顺序的元素集合进行重新排列,使其按照某种规则(如升序或降序)呈现有序状态。这个过程涉及到多种排序...

    易语言文本数组排序集成

    在“易语言文本数组排序集成”中,快速排序被用作主要的排序手段。快速排序的核心步骤包括: 1. **选择基准**:从数组中选取一个元素作为基准(pivot)。 2. **分区操作**:重新排列数组,使得所有小于基准的元素...

Global site tag (gtag.js) - Google Analytics