Java实现快速排序算法

来源:互联网 发布:云计算架构工程师招聘 编辑:程序博客网 时间:2024/06/11 07:51

快速排序

一、 算法描述

快速排序是对冒泡排序的一种改进。在冒泡排序中,记录每次都是与相邻位置上的数据作比较,因此每次只能移动一个位置。而在快速排序中,记录的比较和移动都是从两端向中间进行的。
其主要思想:首先在待排序数组中选取一个基准值(作为比较对象),然后利用基准值将待排数组分成2个部分。基准值左边的数组的数据都小于或等于基准值;基准值右边的数组的数据都大于或等于基准值,然后分别对这两部分重复上述过程,直到整个数组变成有序数组。
显然,快速排序是一个递归的过程。

下面举例分析:
这里写图片描述

二、 算法分析

快速排序的趟数取决于递归的深度。

最好的情况:每次划分对一个记录定位后,该记录的左侧子序列与右侧子序列长度相等。
时间复杂度:O(nlog₂n)。

最坏情况:待排数组是正序或反序,那么每次划分都只能有一个子序列。
时间复杂度:O(n²)。

快速排序是一种不稳定的排序。

三、 算法实现(主要代码)

public class QuickSortArray {    private void QuickSort(int[] arr, int lowIndex, int highIndex){        int lo = lowIndex; //左侧扫描的标记位        int hi = highIndex; //右侧扫描的标记位        int povit = arr[lowIndex];  //选取数组第一个值为比较的基准值        while(lo<hi){            while(lo<hi && povit<=arr[hi]) //右侧扫描                hi--;                      //右标记位向前移动一位            if(lo<hi){                           //出现比基准值小的数                System.out.println("");                swap(arr,lo,hi);                 //交换2个值                lo++;                            //左标记位向后移动一位            }            while(lo<hi && povit>=arr[lo])  //左侧扫描                lo++;                       //左标记位向后移动一位              if(lo<hi){                      //出现比基准值大的数                System.out.println("");                swap(arr,lo,hi);            //交换2个值                hi--;                       //右标记位向前移动一位            }        }        //成功进行了第一次划分,下面分别利用递归对基准值左右两侧的数组进行快速排序        if(lowIndex<lo){             QuickSort(arr,lowIndex,lo-1);          }        if(hi<highIndex){             QuickSort(arr,lo+1,highIndex);        }    }    private void swap(int[] arr, int lo, int hi) {   //交换数组的值        int temp = arr[hi];        arr[hi] = arr[lo];        arr[lo] = temp;        for(int i=0;i<arr.length;i++){            System.out.print(arr[i]+",");        }    }
0 0
原创粉丝点击