Java实现快速排序

一、常用排序算法总结和对比

1.常见排序算法的总结对比及相关术语解释:
在这里插入图片描述
在这里插入图片描述

二、快速排序的基本介绍和算法思路

1.基本介绍:快速排序(Quick Sort)概念:是由冒泡排序改进而得到的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。如果能通过两个(不相邻)记录的一次交换,消除多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换可以消除多个逆序。

2.快速排序的算法思路:在待排序的n个记录中任取一个记录(通常取第一个记录)作为枢轴(或支点),设其关键字为pivotkey。经过一趟排序后,把所有关键字小于pivotkey的记录交换到前面,把所有关键字大于pivotkey的记录交换到后面,结果将待排序记录分成两个子表,最后将枢轴放置在分界处的位置。然后,分别对左右子表重复上述过程,直至每个子表只有一个记录时排序完成。

3.示例分析——快速排序的过程:

例如对如下记录进行快速排序 :49,38,65,97,76,13,27,49*
下面将会对上述记录进行快速排序,排序的过程如下所示:
初始化:49(low/pivotkey),38,65,97,76,13,27,49*(high)
第一趟排序以第一个数49作为枢轴进行快速排序
排序的过程是交替振荡逼近的:就是pivotkey先和数组中最后一个数进行比较,不交换的话就和倒数第二个数进行比较直到交换,如果交换了,pivotkey就和数组第一个数进行比较,如果不交换的话pivotkey就和就和第二个数进行比较,直到交换,交换后pivotkey就要和之前后面所交换的前一个数进行比较,依次下去,这就是交替振荡逼近法。
第一趟快速排序:{27,38,13},49,{76,97,65,49*}
第二趟快速排序:{13},27,{38},49,{76,97,65,49*}
第三趟快速排序:13,27,38,49,{49,65},76,{97}
第四趟快速排序:13,27,38,49,49*,{65},76,97
第四趟快速排序:13,27,38,49,49*,65,76,97

三、代码实现:

import java.util.Arrays;

public class QuickSortTest {
    public static void main(String[] args) {
        int[] arr={-9,78,0,23,-567,70,-1,900,4561};
        quickSortTest(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }

    public static void swap(int array[], int low, int high)//用于交换数组中两个数值
    {
        int temp;//中间变量用于交换两个数值
        temp = array[low];
        array[low] = array[high];
        array[high] = temp;
    }
    public static int partition(int[] array,int low,int high){
        int pivotkey=array[low];//设置数组第一个元素为比较元素
        while (low<high){
        	//如果数组最后一个元素比pivotkey大,那么此时就应该将high向前移动
            while ((low<high) && array[high]>=pivotkey){
                high--;
            }
            //否则就交换array[low]和array[high]的值
            swap(array,low,high);
            //如果数组首个元素比pivotkey小,那么此时就应该将low向后移动
            while ((low<high) && array[low]<=pivotkey){
                low++;
            }
            //否则就交换array[low]和array[high]的值
            swap(array,low,high);
        }
        return low;//最后返回之后枢轴的值
    }
    public static void quickSortTest(int[] array,int low,int high){
        if (low<high){
            int key=partition(array,low,high);
            quickSortTest(array,low,key-1);//递归左边子序列
            quickSortTest(array,key+1,high);//递归右边子序列
        }
    }

}

四、代码测试:

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值