`
zhijian
  • 浏览: 5579 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

快速排序法

阅读更多
快速排序法:

已数组a[11]为例:
16,9,3,49,8,7,34,10,12,30
quickSort(a[],start,end)
第一步,以a[0]为关键数据key,i为数组开始下标,j为数组结束下标,
key=16 ,i = 0 ,j = 10;

第二步从最后开始,即a[j]开始,j--,向左侧比较,查找第一个比key小的数据,然后将a[0]与a[j]调换
12,9,3,49,8,7,34,10,16,30
key = 16 ,i = 0 ,j = 9;

第三步,从左侧开始比较,j++,查找第一个比key大的数据,并交换a[i]与a[j]位置
12,9,3,16,8,7,34,10,49,30
key = 16 ,i = 3 ,j =9;

第四步,跳至第二步,直至i=j;
(从右侧比较)
12,9,3,10,8,7,34,16,49,30
key = 16 ,i = 3 ,j =8;
(从左侧比较)
12,9,3,10,8,7,16,34,49,30
key = 16 ,i = 6 ,j =8;
(从右侧比较)
j=6=i;跳出循环
此时可以得到这样一个数据,在关键数据key左边的数据都比key小,而右边都比key大;

第五步,递归调用,分别对数据的前后两部分数据进行排序,quickSort(a[],start,i-1);quickSort(a[],j+1,end);

代码:
package com.sort;

public class QuickSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a[]= {16,9,3,49,8,7,34,10,12,30};
		System.out.println("原始数据");
		show(a);
		System.out.println("正在排列");
		quickSort(a,0,a.length-1);
		System.out.println("排列后数据");
		show(a);
	}

	public static void quickSort(int a[],int start,int end){
		int key = a[start];
		int i= start;
		int j= end;
		while(i<j){
			while(i<j && a[j]>=key){
				j--;
			}
			if(true){
				int temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
			//System.out.println("从右侧:");
			//show(a);
			while(i<j && a[i]<=key){
				i++;
			}
			if(true){
				int temp=a[j];
				a[j]=a[i];
				a[i]=temp;
			}			//System.out.println("从左侧:");
			//show(a);
		}
		//a[i]=key;
		//System.out.println("准备进入递归");
		show(a);
		if(i-1>start){
			//System.out.println("左侧递归");
			quickSort(a, start, i-1);
		}
		if(j+1<end){
			//System.out.println("右侧递归");
			quickSort(a, j+1, end);
		}
	}
	
	public static void show(int a[]){
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+"\t");
		}	
		System.out.println();
	}
}



改进:
由于我们已经将a[0]的值保存在了一个key中,因此我们可以不用每次都交换两个数的值,直到最后i=j时再将key值赋到a[i]中,这样的话可以减少交换次数

package com.sort;

public class QuickSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a[]= {16,9,3,49,8,7,34,10,12,30};
		System.out.println("原始数据");
		show(a);
		System.out.println("正在排列");
		quickSort(a,0,a.length-1);
		System.out.println("排列后数据");
		show(a);
	}

	public static void quickSort(int a[],int start,int end){
		int key = a[start];
		int i= start;
		int j= end;
		while(i<j){
			while(i<j && a[j]>=key){
				j--;
			}
			a[i]=a[j];
			//System.out.println("从右侧:");
			//show(a);
			while(i<j && a[i]<=key){
				i++;
			}
			a[j]=a[i];
			//System.out.println("从左侧:");
			//show(a);
		}
		a[i]=key;
		//System.out.println("准备进入递归");
		show(a);
		if(i-1>start){
			//System.out.println("左侧递归");
			quickSort(a, start, i-1);
		}
		if(j+1<end){
			//System.out.println("右侧递归");
			quickSort(a, j+1, end);
		}
	}
	
	public static void show(int a[]){
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+"\t");
		}	
		System.out.println();
	}
}


分享到:
评论

相关推荐

    C经典算法之快速排序法(三)

    ### C经典算法之快速排序法(三) 在探讨快速排序法的过程中,我们已经了解到轴的选择对于算法效率至关重要。本文将介绍一种高效的轴选择方法,该方法来源于著名的算法书籍《Introduction to Algorithms》。通过...

    快速排序法的C++代码

    ### 快速排序法的C++实现 #### 算法概述 快速排序是一种非常高效的排序算法,由英国计算机科学家托尼·霍尔于1960年提出。它的基本思想是采用分治策略来把一个序列分为较小的两部分,然后递归地对这两部分进行排序...

    快速排序法 C++ 初学者代码

    快速排序法 C++ 初学者代码 简单的准确的

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

    描述中的程序实现了快速排序法,可能是用一种编程语言如C++、Java或Python编写的,用于对一维数组进行排序。这种程序的实现一般包括上述的三个主要步骤,并可能包含优化措施,例如处理小数组时改用插入排序,或者...

    快速排序法C语言详解

    快速排序是一种高效的排序算法,它使用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。在C语言中实现快速排序,通常涉及到以下几个关键知识点: 1. 递归函数:快速排序的核心是递归...

    直接排序法,折半插入法,希尔排序法,快速排序法(c语言实现)

    直接排序法、折半插入法、希尔排序法和快速排序法是计算机科学中常见的排序算法,它们在数据处理和算法理解上都具有重要的地位。这些排序算法的C语言实现为初学者提供了很好的学习材料,特别是在VC++6.0环境下进行...

    java Document 快速排序法

    然而,标题中的"java Document 快速排序法"可能指的是在一个包含文档数据的结构(如数组)中实现快速排序,而不是直接在Document对象上操作。由于Document主要处理文本数据,我们通常不会直接在Document上进行数值...

    JAVA快速排序法.pdf

    JAVA快速排序法 JAVA快速排序法是一种高效的排序算法,属于选择排序的一种。它的主要思想是通过选择一个基准元素,将数组分成两个部分:一部分比基准元素小,一部分比基准元素大,然后递归地对这两个部分进行排序。...

    一个快速排序法的例子

    在描述中提到的“一个快速排序法的例子”是一个具体的应用场景,即生成1亿个随机数并使用快速排序算法对其进行排序,整个过程大约耗时26秒。这个时间可能因硬件性能、数据分布均匀性以及实现细节等因素而有所不同。...

    Java版快速排序法

    这是一个用Java语言实现的快速排序算法,快速排序算法是根据分冶思想去实现的。

    快速排序法 排序算法

    快速排序法是计算机科学中一种高效的排序算法,其时间复杂度在平均情况下为O(nlogn),这使得它成为处理大规模数据集时的首选排序算法之一。快速排序法由英国计算机科学家托尼·霍尔(Tony Hoare)于1960年提出,基于...

    快速排序法改进版

    在快速排序法基础上提供了一些改进,比基本的快速排序更方便简洁

    用JAVA语言实现的对数据的快速排序法

    根据给定文件中的标题、描述、标签以及部分内容,可以总结并提炼出以下关于“使用JAVA语言实现的对数据的快速排序法”的相关知识点: ### 一、知识点概述 #### 标题:用JAVA语言实现的对数据的快速排序法 - **主要...

    代码包_分治法快速排序法示例_

    在这个"代码包_分治法快速排序法示例_"中,我们将深入探讨快速排序的工作原理、实现过程以及它在实际编程中的应用。 快速排序的基本步骤如下: 1. **选择基准元素**:首先,我们需要在待排序的数组中选择一个基准...

    java快速排序法

    清楚明确的代码书写,让你轻易学懂快速排序法

    c 语言 快速排序法

    ### c 语言快速排序法知识点解析 #### 快速排序法简介 快速排序是一种非常高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)于1960年提出。它采用分治策略来把一个序列分为较小的两个子序列,再递归地...

    C经典算法之快速排序法(二)

    ### C经典算法之快速排序法(二) #### 知识点概述 本篇文章将深入探讨快速排序算法的一个改进版本,并通过具体的代码实现来展现这一优化思路。在快速排序法(一)的基础上,本文重点关注轴的选择对算法性能的影响...

    C经典算法之快速排序法(一)

    ### C经典算法之快速排序法(一) #### 快速排序法概述 快速排序法(Quick Sort)是一种高效的排序算法,被广泛认为是目前最快的排序方法之一,尤其是在处理大规模数据时,其平均时间复杂度为O(nlogn),在实际应用...

Global site tag (gtag.js) - Google Analytics