目录
1、基本思路
从待排的序列中任意选取一个元素(一般选第一个)作为分界值,与离它最远的元素进行比较。
将所有比它小的元素放在左边,比它大的放在右边。
经过一趟下来形成:左边子序列(都比分界值小),分界值,右边子序列(都比分界值大)。
再将左右两个序列按照上述方法进行排序,直到分不出子序列为止。
2、排序流程
举个例子:将下列数据按照从小到大的顺序进行快速排序。
49、38、65、97、76、13、27
第一趟,选择49为分界值,与最远的元素27进行比较。
27、38、65、97、76、13、49
第二趟,49与38进行比较
27、38、65、97、76、13、49
第三趟,49与65进行比较
27、38、49、97、76、13、65
第四趟,49与13进行比较
27、38、13、97、76、49、65
第四趟,49与97进行比较
27、38、13、49、76、97、65
此时,49大于左边的所有元素,小于右边的所有元素。
第五趟,左边序列选择27为分界值与13进行比较,右边序列选择76为分界值与65进行比较。
13、38、27、49、65、97、76
第六趟,左边序列27与38进行比较,右边序列76为分界值与97进行比较。
13、27、38、49、65、76、97
3、代码
public class QuickSort{
public static void main(String[] args){
//声明数组
int nums[] = {49、38、65、97、76、13、27};
//应用快速排序算法
quickSort(nums, 0, nums.length-1);
//显示排序后的数组
for(int i = 0; i < nums.length; ++i){
System.out.print(nums[i] + ",");
}
}
public static void quickSort(int data[], int start, int end){
int i = start;//从左往右比较的索引
int j = end; //从右往左比较的索引
if(i >= j) return; //判断分界值是否到中间了,防止出现递归死循环。
//当flag为true时,分界值与右边序列的元素比较大小;为false时,与左边序列的元素比较大小。
boolean flag = true;
while(i != j){ //当i与j相等时,该趟比较结束
if(data[i] > data[j]){ //小的放左边,大的放右边
int temp = data[i];
data[i] = data[j];
data[j] = temp;
//元素交换的同时,也要修改flag标记
flag = !flag;
}
if(flag == true) j--;
else i++;
}
//一趟排序完毕后,划分左右两个序列
i--;
j++;
quickSort(data, start, i);//左边子序列再进行排序
quickSort(data, j, end);//右边子序列再进行排序
}
}
4、时间复杂度
最坏情况 O(n^2)
最好情况 O(n*log(n))
平均情况 O(n*log(n))
不稳定
感谢您的观看,希望你今天特别特别开心,加油~