1 package com.demo.ds.sort;
2 /**
3 * 优化1:每趟循环不需要比较到最后,比较完无序队列即可
4 * j<arr.length-1-i
5 *
6 * 优化2:如果已经优先,不需要进行后续趟的循环,提高效率
7 * 至多需要n-1趟循环,至少1趟
8 * 判断是否已经有序,需要一趟循环。如果一趟循环没有发生交换,就是已经有序
9 * @author Administrator
10 *
11 */
12 public class TestBubble {
13
14 public static void main(String[] args) {
15 //定义一个无序数组
16 int [] scoreArr = {75,87,56,45,89,100,76,34,89,97};
17 //int [] scoreArr = {10,20,30,80,40,50,60};
18
19 //排序前输出
20 System.out.println("排序前");
21 for(int score :scoreArr){
22 System.out.print(score+"\t");
23 }
24 //排序
25 bubbleSort(scoreArr);
26
27 //排序后输出
28 System.out.println("\n排序后");
29 for(int score :scoreArr){
30 System.out.print(score+"\t");
31 }
32 }
33 public static void bubbleSort(int[] arr) {
34 //外循环:n个数,最多循环n-1趟
35 for(int i=0;i<arr.length-1;i++){
36 //System.out.println(i);
37 //定义符号量flag,表示是否发生过交换
38 boolean flag = false;//没有交换
39 //小循环:
40 for(int j=0;j<arr.length-1-i;j++){
41 //如果前一个大于后一个,交换
42 if(arr[j] > arr[j+1]){
43 int temp;
44 temp = arr[j];
45 arr[j] = arr[j+1];
46 arr[j+1] = temp;
47
48 flag = true;//发生了交换
49 }
50 }
51 //判断是否有序
52 if(!flag){
53 break;
54 }
55
56 }
57 }
58 public static void bubbleSort2(int[] arr) {
59 //外循环:n个数,最多循环n-1趟
60 for(int i=0;i<arr.length-1;i++){
61 //小循环
62 for(int j=0;j<arr.length-1;j++){
63 //如果前一个大于后一个,交换
64 if(arr[j] > arr[j+1]){
65 int temp;
66 temp = arr[j];
67 arr[j] = arr[j+1];
68 arr[j+1] = temp;
69 }
70 }
71 }
72 }
73
74 }
package com.demo.ds.sort;
import java.util.Arrays;
public class TestQuickSort {
private static int partition(int[] arr, int low, int high) {
//定义两个指针i,j,分别指向开始元素和结束元素
int i = low;
int j = high;
//挖坑,将第一个元素作为基准值
int x = arr[i];
//通过循环完成分区操作
while(i<j){
//1.右指针j向左移动,找到小于基准值的元素
while(i<j && arr[j]>=x ){
j--;
}
//2.使用右边元素填左边的坑,右边生成坑
if(i<j){
arr[i] = arr[j];
i++;
}
//3.左指针i向右移动,找打大于基准值的元素
while(i<j && arr[i] < x){
i++;
}
//4.使用左边元素填右边的坑,左边生成坑
if(i<j){
arr[j] = arr[i];
j--;
}
}
//将基准元素放入i=j的坑中
arr[i] = x;
//arr[j] = x;
//返回分区界限的索引
return i;//return j;
}
private static void quickSort(int[] arr, int low, int high) {
if(low < high){
//对数组进行分区,分为前后两个分区,返回分区的界限
int n = partition(arr,low,high);
//对左分区进行快速排序
quickSort(arr,low,n-1);
//对右分区进行快速排序
quickSort(arr,n+1,high);
}
}
public static void quickSort(int[] arr) {
int low = 0;
int high = arr.length-1;
quickSort(arr,low,high);
}
public static void main(String[] args) {
//指定一个无序数列
int arr[] = {72,6,57,60,88,60,42,83,73,88,48,85};
//输出无序数列
System.out.println(Arrays.toString(arr));
//快速排序
quickSort(arr);
//partition(arr,0,arr.length-1);
//输出有序数列
System.out.println(Arrays.toString(arr));
}
}