快速排序是典型的使用分治策略的一种交换排序.
一般步骤:
1)选择一个枢纽元素(关键点);
2)使用该枢纽元素分割数组,使得比该元素小的元素在它的左边,比它大的在右边。并把枢纽元素放在合适的位置;
3)根据枢纽元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽元素自己,对左边的,右边的分别递归调用快速排序算法即可。
由于关键点是用来比较的基准所以如果基准选择得当可以减少交换的次数, 从而提高算法效率 , 是比较有技巧的部分), 以该关键点元素作为基准, 从数组两头分别与之比较, 大的放右边,小的放左边,相等的无论哪边都成(干脆不动). 最后当遍历完数组一遍(即两头的标志指向同一个数组元素)时把关键点元素放到该位置(此时确定这里为分治点 ),完成一次排序.
例如:待排序的数组A的值分别是:(初始关键数据X:=49)
A[1] A[2] A[3] A[4] A[5] A[6] A[7]
49 38 65 97 76 13 27
进行第一次交换后: 27 38 65 97 76 13 49
进行第二次交换后: 27 38 49 97 76 13 65
进行第三次交换后: 27 38 13 97 76 49 65
进行第四次交换后: 27 38 13 49 76 97 65
经过一躺快速排序之后的结果是:
27 38 13 49 76 97 65
即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。
快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程:
初始状态 {49 38 65 97 76 13 27}
进行一次快速排序之后划分为 {27 38 13} 49 {76 97 65}
分别对前后两部分进行快速排序后:
{13} 27 {38} 49 { 65} 76 {97}
public class Quicksort {
private int getPivot(int begin, int end) {
return (begin + end) >> 1;
}
// 一次排序
private int partition(int[] array, int begin, int end) {
int pivot = getPivot(begin, end);
// int pivot=0; 也可以
int tmp = array[pivot];
array[pivot] = array[end];
while (begin != end) {
while (array[begin] < tmp && begin < end)
begin++;
if (begin < end) {
array[end] = array[begin];
end--;
}
while (array[end] > tmp && end > begin)
end--;
if (end > begin) {
array[begin] = array[end];
begin++;
}
}
// 此时两个下标指向同一个元素.以这个位置左右分治(分治点)
array[begin] = tmp;
return begin;
}
private void qsort(int[] array, int begin, int end) {
if (end - begin < 1)
return;
int pivot = partition(array, begin, end);
qsort(array, begin, pivot);
qsort(array, pivot + 1, end);
}
public void sort(int[] array) {
qsort(array, 0, array.length - 1);
}
public static void main(String[] args) {
int[] array = { 3, 2, 2, 2, 3, 1, 4, 5, 1 };
// int[] array={49,38,65,97,76,13,27};
new Quicksort().sort(array);
//new Quicksort().partition(array,0,6);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + ", ");
}
}
}
下载源码:
分享到:
相关推荐
快速排序 java实现
快速排序的简单实现程序,java编制,迭代法对数据组分区,知道简单的java基础,基本就可以看懂这个小程序了
快速排序JAVA源代码,已运行成功 同时可以记录整个过程中的比较次数
快速排序 java c++ 随机算法 最高效
在“快速排序java代码.zip”这个压缩包中,可能包含了一个或多个Java源文件,这些文件实现了上述的快速排序算法,可能还包含了测试用例和相关的解释,以帮助学习者理解并应用快速排序。在学习过程中,你可以通过查看...
java 快速排序实现。可以跑的代码 java 快速排序实现。可以跑的代码 java 快速排序实现。可以跑的代码 java 快速排序实现。可以跑的代码
在Java中实现快速排序,我们通常会定义一个`quickSort()`方法,该方法接受一个整数数组作为参数。快速排序的核心在于选择一个基准元素(pivot),并重新排列数组使得所有小于基准的元素都在其前,所有大于基准的元素...
在这个Java实现中,我们将详细探讨快速排序的工作原理,代码结构,以及如何通过源码理解和运用这个工具。 快速排序的步骤如下: 1. **选择基准元素(Pivot Selection)**:首先,从数组中选择一个元素作为“基准”...
### 快速排序Java实现详解 #### 一、快速排序简介 快速排序是一种非常高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)于1960年提出。它采用分治法(Divide and Conquer)策略来把一个序列分为较小和...
总的来说,快速排序和折半查找是计算机科学中不可或缺的算法,通过递归和分治策略,可以在Java中高效地实现这些算法,并结合界面设计,为用户提供直观的交互体验。在实际项目中,理解和掌握这些算法有助于优化数据...
public static void quicksort(int[] array,int start, int end){ if(start>=end) return; int middle=partition(array,start,end); quicksort(array,start,middle-1); quicksort(array,middle+1,end);...
在Java中实现快速排序,首先我们需要一个基准值(pivot)来划分数组。通常选择数组的第一个元素或最后一个元素作为基准。然后,我们遍历数组,将所有小于基准的元素放在基准的左边,大于基准的放在右边。这样,基准...
利用分治法思想实现快速排序,Java语言描述。
在Java中实现快速排序,我们需要定义一个方法来执行这个过程。下面是一个简化的快速排序算法的Java实现: ```java public class QuickSort { public static void quickSort(int[] arr, int low, int high) { if ...
内容概要:文章详述了快速排序算法的基本概念、分治策略以及具体实现方式,提供Java和Python两个版本的代码样例。快速排序算法能够将一个序列分解成较小和较大的两部分,并通过递归的方式分别对这两部分进行排序,...
此代码是快速排序的实现代码,采用分治的方法,能垢计算计算机处理快速排序的时间。
java语言实现的快速排序源码,其中包括java语言的随机数组生成器。
### JAVA实现的快速排序 #### 知识点详解 **一、快速排序算法介绍** 快速排序(Quick Sort)是一种非常高效的排序算法,采用分治法(Divide and Conquer)策略来把一个序列分为较小和较大的两个子序列,然后递归...
根据给定文件的信息,本文将围绕“用Java实现快速排序”的主题进行展开,不仅解析标题与描述中的核心知识点,还会对部分代码示例进行解读,最后结合这些信息给出一个完整的快速排序算法实现。 ### 快速排序算法简介...