快速排序法:
已数组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经典算法之快速排序法(三) 在探讨快速排序法的过程中,我们已经了解到轴的选择对于算法效率至关重要。本文将介绍一种高效的轴选择方法,该方法来源于著名的算法书籍《Introduction to Algorithms》。通过...
### 快速排序法的C++实现 #### 算法概述 快速排序是一种非常高效的排序算法,由英国计算机科学家托尼·霍尔于1960年提出。它的基本思想是采用分治策略来把一个序列分为较小的两部分,然后递归地对这两部分进行排序...
快速排序法 C++ 初学者代码 简单的准确的
描述中的程序实现了快速排序法,可能是用一种编程语言如C++、Java或Python编写的,用于对一维数组进行排序。这种程序的实现一般包括上述的三个主要步骤,并可能包含优化措施,例如处理小数组时改用插入排序,或者...
快速排序是一种高效的排序算法,它使用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。在C语言中实现快速排序,通常涉及到以下几个关键知识点: 1. 递归函数:快速排序的核心是递归...
直接排序法、折半插入法、希尔排序法和快速排序法是计算机科学中常见的排序算法,它们在数据处理和算法理解上都具有重要的地位。这些排序算法的C语言实现为初学者提供了很好的学习材料,特别是在VC++6.0环境下进行...
然而,标题中的"java Document 快速排序法"可能指的是在一个包含文档数据的结构(如数组)中实现快速排序,而不是直接在Document对象上操作。由于Document主要处理文本数据,我们通常不会直接在Document上进行数值...
JAVA快速排序法 JAVA快速排序法是一种高效的排序算法,属于选择排序的一种。它的主要思想是通过选择一个基准元素,将数组分成两个部分:一部分比基准元素小,一部分比基准元素大,然后递归地对这两个部分进行排序。...
在描述中提到的“一个快速排序法的例子”是一个具体的应用场景,即生成1亿个随机数并使用快速排序算法对其进行排序,整个过程大约耗时26秒。这个时间可能因硬件性能、数据分布均匀性以及实现细节等因素而有所不同。...
这是一个用Java语言实现的快速排序算法,快速排序算法是根据分冶思想去实现的。
快速排序法是计算机科学中一种高效的排序算法,其时间复杂度在平均情况下为O(nlogn),这使得它成为处理大规模数据集时的首选排序算法之一。快速排序法由英国计算机科学家托尼·霍尔(Tony Hoare)于1960年提出,基于...
在快速排序法基础上提供了一些改进,比基本的快速排序更方便简洁
根据给定文件中的标题、描述、标签以及部分内容,可以总结并提炼出以下关于“使用JAVA语言实现的对数据的快速排序法”的相关知识点: ### 一、知识点概述 #### 标题:用JAVA语言实现的对数据的快速排序法 - **主要...
在这个"代码包_分治法快速排序法示例_"中,我们将深入探讨快速排序的工作原理、实现过程以及它在实际编程中的应用。 快速排序的基本步骤如下: 1. **选择基准元素**:首先,我们需要在待排序的数组中选择一个基准...
清楚明确的代码书写,让你轻易学懂快速排序法
### c 语言快速排序法知识点解析 #### 快速排序法简介 快速排序是一种非常高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)于1960年提出。它采用分治策略来把一个序列分为较小的两个子序列,再递归地...
### C经典算法之快速排序法(二) #### 知识点概述 本篇文章将深入探讨快速排序算法的一个改进版本,并通过具体的代码实现来展现这一优化思路。在快速排序法(一)的基础上,本文重点关注轴的选择对算法性能的影响...
### C经典算法之快速排序法(一) #### 快速排序法概述 快速排序法(Quick Sort)是一种高效的排序算法,被广泛认为是目前最快的排序方法之一,尤其是在处理大规模数据时,其平均时间复杂度为O(nlogn),在实际应用...