冒泡排序
比较相邻的两个数,如果第二个数比第一个大,就交换,直到最后一个数为最大的
时间复杂度O(n²)
package com.ronzheng.suanfa;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr ={4,1,5,2,3,45};
//从小到大冒泡排序
// for (int i = 1; i < arr.length; i++) {
// for (int j = 0; j < arr.length-i; j++) {
// if(arr[j]>arr[j+1]){
// int temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
// }
// }
// }
//从大到小冒泡排序
//趟数 5个数只需要4趟
for (int i = 1; i < arr.length; i++) {
//一趟交换的次数 5个数第一趟交换4次,第二趟交换3次...
for (int j = 0; j < arr.length-i; j++) {
if(arr[j]<arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
快速排序(二分排序):
选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。
package com.ronzheng.suanfa;
public class QuickSort {
public static void quickSort(int[] arr,int low,int high){
int i,j,temp,t;
if(low>high){
return;
}
i=low;
j=high;
//temp就是基准位
temp = arr[low];
// 这时候,跳出上面大的while循环之后,i和j肯定是相等的,因为上面循环的条件是i<j,所以,跳出循环时,i和j是相等的
while (i<j) {
//先看右边,依次往左递减
while (temp<=arr[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=arr[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
/**
* 假如最好的情况是一个有序序列 1 3 5 7 9
* temp = 1
* i = 0 arr[i] = 1
* j = 4 arr[j] = 9
* 而且在这里,如果先从左边开始寻找的话,一直往右寻找大于1的数,直到i变成4还没有找到就停止了;但是下面的语句就会把9赋值在1上了
* 如果先从右边开始寻找的话,一直往左寻找小于1的数,直到j变成0还没有找到然后停止,此时i和j都是0,所以就是把自身交换一下并不影响顺序。
* 这也是为什么强调如果选择数组左边第一个数作为基准值的时候,得先从右边开始查找数。
*/
// 最后将基准位与i和j相等位置的数字交换
// 下面的i和j其实相等的,所以用哪一个都一样。
arr[low] = arr[i];
arr[i] = temp;
//递归调用左半数组
quickSort(arr, low, j-1);
//递归调用右半数组
quickSort(arr, j+1, high);
}
public static void main(String[] args){
int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
quickSort(arr, 0, arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}