快速排序总结。
工作了也有些时日了,在自己做过的java项目中呢,确实没有自己写过排序到项目中去,而自己掌握的只是一个简单的冒泡排序,随着时间的积累,对于程序的性能也越来越关注,因此也更加关注于自己的技能细节方面的改进,因此今天来写一下快速排序的思想和算法,也算是一种提升。
快速排序介绍:
快速排序,根据教科书上的说法来看,是冒泡排序的一种改进。接下来就用个人思想来解释这快速排序的概念吧:
快速排序,由一个待排序的数组(array),以及找准三个变量,一个是中枢值(这里定义为pivot),左值(这里定义为left),右值(这里定义为right);我们根据中数值(pivot)来做调整,每一次的改变,都将数组(array)分成 三个部分:
第一部分:中枢值(一个单独的数字构成),这个值在每一次排序好的“最中间”
第二部分:左边数组(由array的一部分值组成),这个数组在 第一部分 中枢值(pivot)的“左边”,其中左边数组中的每一个值(不一定是排好序的,可能是乱序的),都比中枢值和右边数组的值要小
第三部分:右边数组(由array的一部分值组成),这个数组在 第一部分 中枢值(pivot)的“右边”,其中右边数组中的每一个值(不一定是排好序的,可能是乱序的),逗比中枢值和左边数组的值要大
以上就是快速排序要做的第一步,将数组按照 : 左边数组、中枢值、右边数组 区分开来
然后根据递归思想,对 左边数组、右边数组 不断的递归调用,然后最终达到从小到大的一个排序
什么是递归?
递归通俗来讲就是通过某种规则,不断的调用自身,然后来达到某种目的。
接下来就用程序片段来将核心代码贴出:
根据注释来详细理解就行
/**
* 快速排序调用方法
* @param ary 待排序数组
* @param left 左值
* @param right 右值
* @return
*/
public static int getSortNum(int ary[], int left, int right) {
// 定义一个中枢值pivot,让其等于数组的左值,枢轴选定后永远不变,最终在中间,前小后大
int pivot = ary[left];
while(left < right) {
// 看后面ary[right] > pivot比较,如果右边数组值大于中枢值,说明不需要调整位置,则让右值(right)自减1
while(left < right && ary[right] > pivot)
{
right--; // 执行自减操作
}
// 如果上面循环不符合条件的,则说明右边数组的一个值,小于中枢值(pivot),则将其替换到左边数组中
ary[left] = ary[right];
// 看后面ary[left] < pivot比较,如果左边数组值小于中枢值,说明不需要调整位置,则让左值(left)自增1
while(left < right && ary[left] < pivot)
{
left++; // 执行自增操作
}
// 如果上面循环不符合条件,则说明左边数组的一个值,大于中枢值(pivot),则将其替换到右边数组中
ary[right] = ary[left];
}
// 最后将中枢值给自增后的左边数组的一个值中
ary[left] = pivot;
// 返回左边数组下标
return left;
}
以下快速排序递归调用方法:
/**
* 快速排序递归方法
* @param ary 待排序数组
* @param left 左值
* @param right 右值
* @return
*/
public static void quickSort(int ary[], int left, int right) {
// 定义中枢值
int pivot;
// 判断
if(left < right)
{
// 根据方法得到了每次中枢值的位置
pivot = getSortNum(ary, left, right);
// 根据中枢值(pivot),来对左边数组进行递归调用快速排序
quickSort(ary, left, pivot-1);
// 根据中枢值(pivot),来对右边数组进行递归调用快速排序
quickSort(ary, pivot+1, right);
}
}
以上就是快速排序核心代码片段,下面来一份完整的快速排序代码:
public class QuickSort {
/**
* 快速排序调用方法
* @param ary 待排序数组
* @param left 左值
* @param right 右值
* @return
*/
public static int getSortNum(int ary[], int left, int right) {
// 定义一个中枢值pivot,让其等于数组的左值,枢轴选定后永远不变,最终在中间,前小后大
int pivot = ary[left];
while(left < right) {
// 看后面ary[right] > pivot比较,如果右边数组值大于中枢值,说明不需要调整位置,则让右值(right)自减1
while(left < right && ary[right] > pivot)
{
right--; // 执行自减操作
}
// 如果上面循环不符合条件的,则说明右边数组的一个值,小于中枢值(pivot),则将其替换到左边数组中
ary[left] = ary[right];
// 看后面ary[left] < pivot比较,如果左边数组值小于中枢值,说明不需要调整位置,则让左值(left)自增1
while(left < right && ary[left] < pivot)
{
left++; // 执行自增操作
}
// 如果上面循环不符合条件,则说明左边数组的一个值,大于中枢值(pivot),则将其替换到右边数组中
ary[right] = ary[left];
}
// 最后将中枢值给自增后的左边数组的一个值中
ary[left] = pivot;
// 返回左边数组下标
return left;
}
/**
* 快速排序递归方法
* @param ary 待排序数组
* @param left 左值
* @param right 右值
* @return
*/
public static void quickSort(int ary[], int left, int right) {
// 定义中枢值
int pivot;
// 判断
if(left < right)
{
// 根据方法得到了每次中枢值的位置
pivot = getSortNum(ary, left, right);
// 根据中枢值(pivot),来对左边数组进行递归调用快速排序
quickSort(ary, left, pivot-1);
// 根据中枢值(pivot),来对右边数组进行递归调用快速排序
quickSort(ary, pivot+1, right);
}
}
public static void main(String[] args) {
int[] ary = {97, 58, 12, 88, 77, 33, 44, 66, 22};
quickSort(ary, 0, ary.length-1);
for(int i=0; i<ary.length; i++) {
if(i!=ary.length-1)
System.out.print(ary[i] + ", ");
else
System.out.println(ary[i]);
}
}
}
以上就是快速排序的完整算法了,互相学习吧。
更多精彩敬请关注公众号
Java极客思维
微信扫一扫,关注公众号