首页 > 代码库 > 快速排序
快速排序
规则:快速排序是找出一个元素(理论上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都小于基准值,基准右边的元素值都大于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正确位置,排序完成。
时间复杂度: T(n)=O(nlogn).
稳定性: 不稳定。
1 import java.util.Arrays;
2
3
4 public class QuickSort {
5
6 /**
7 *
8 * @param args
9 * @author wangpan
10 */
11 public static void main(String[] args) {
12 int[] a={24,12,65,34,100,11,23,76,34};
13 System.out.println("排序前:"+Arrays.toString(a));
14 sort(a, 0, a.length-1);
15 System.out.println("排序后:"+Arrays.toString(a));
16 }
17
18 /**
19 * 调用该方法将待排序数组分成两部分,左边一部分数据比右边一部分数据小
20 * @param a 待排序的数组
21 * @param right 数组的右边界
22 * @param left 数组的左边界
23 * @author wangpan
24 */
25 public static int partition(int[] a,int low,int high){
26 int right=high; //right存储数组上边界
27 int left=low; //left存储数组下边界
28 int temp=a[low]; //temp存储数组第一个值
29 while(right>left){
30 while(a[right]>=temp&&left<right){ //从右边开始找到第一个小于temp的值
31 right--;
32 }
33 a[left]=a[right];
34 while(a[left]<=temp&&left<right){ //从左边开始找到第一个大于temp的值
35 left++;
36 }
37 a[right]=a[left];
38 }
39 a[left]=temp; //将基准值填充到分界点
40 return left;
41 }
42
43 /**
44 * 递归调用sort方法将数组排序
45 * @param a
46 * @param low
47 * @param high
48 * @author wangpan
49 */
50 public static void sort(int[] a,int low,int high){
51 if(low<high){
52 int mid=partition(a, low, high); //将数组分成两个部分,mid为分界点
53 sort(a, low, mid-1); //递归调用对前半部分排序
54 sort(a, mid+1, high); //递归调用对后半部分排序
55 }
56 }
57
2
3
4 public class QuickSort {
5
6 /**
7 *
8 * @param args
9 * @author wangpan
10 */
11 public static void main(String[] args) {
12 int[] a={24,12,65,34,100,11,23,76,34};
13 System.out.println("排序前:"+Arrays.toString(a));
14 sort(a, 0, a.length-1);
15 System.out.println("排序后:"+Arrays.toString(a));
16 }
17
18 /**
19 * 调用该方法将待排序数组分成两部分,左边一部分数据比右边一部分数据小
20 * @param a 待排序的数组
21 * @param right 数组的右边界
22 * @param left 数组的左边界
23 * @author wangpan
24 */
25 public static int partition(int[] a,int low,int high){
26 int right=high; //right存储数组上边界
27 int left=low; //left存储数组下边界
28 int temp=a[low]; //temp存储数组第一个值
29 while(right>left){
30 while(a[right]>=temp&&left<right){ //从右边开始找到第一个小于temp的值
31 right--;
32 }
33 a[left]=a[right];
34 while(a[left]<=temp&&left<right){ //从左边开始找到第一个大于temp的值
35 left++;
36 }
37 a[right]=a[left];
38 }
39 a[left]=temp; //将基准值填充到分界点
40 return left;
41 }
42
43 /**
44 * 递归调用sort方法将数组排序
45 * @param a
46 * @param low
47 * @param high
48 * @author wangpan
49 */
50 public static void sort(int[] a,int low,int high){
51 if(low<high){
52 int mid=partition(a, low, high); //将数组分成两个部分,mid为分界点
53 sort(a, low, mid-1); //递归调用对前半部分排序
54 sort(a, mid+1, high); //递归调用对后半部分排序
55 }
56 }
57
58 }
快速排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。