快速排序
一、 算法描述
快速排序是对冒泡排序的一种改进。在冒泡排序中,记录每次都是与相邻位置上的数据作比较,因此每次只能移动一个位置。而在快速排序中,记录的比较和移动都是从两端向中间进行的。
其主要思想:首先在待排序数组中选取一个基准值(作为比较对象),然后利用基准值将待排数组分成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]+",");
}
}