一、冒泡排序
冒泡排序原理
冒泡排序就是依次比较数组中相邻的两个元素,如果左边比右边大(或者左边比右边小)则进行调换,以此类推,这样第一次排序就把最大(最小)的元素放在最底下。
例如:数组 int[] arr = {8,10,5,12,9,4};
第一轮排序结果为: [8, 5, 10, 9, 4, 12]
第二轮排序结果为: [5, 8, 9, 4, 10, 12]
第三轮排序结果为: [5, 8, 4, 9, 10, 12]
第四轮排序结果为: [5, 4, 8, 9, 10, 12]
第五轮排序结果为: [4, 5, 8, 9, 10, 12]
代码
package com;
import java.util.Arrays;
/**
* 冒泡排序
*/
public class ArraySort01 {
public static void main(String[] args) {
int[] arr = { 8, 10, 5, 12, 9, 4 };
System.out.println("排序前的数组:" + Arrays.toString(arr));
for (int j = 1; j < arr.length; j++) {
for (int i = 0; i < arr.length - j; i++) {
int type;// 声明一个中间量,用于交换位置使用
// 每相邻的两个数比较
if (arr[i] > arr[i + 1]) {
// 交换位置
type = arr[i];// 将前面一个元素放到中间量
arr[i] = arr[i + 1];// 将后面一个元素放到前面的位置
arr[i + 1] = type;// 将中间量中的元素放到后面的位置
}
}
System.out.println("第" + j + "轮排序后的数组:" + Arrays.toString(arr));
}
}
}
选择排序
选择排序就是从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
例如:数组 int[] arr = {8,10,5,12,9,4};
第一轮排序结果为: [4, 10, 5, 12, 9, 8]
第二轮排序结果为: [4, 5, 10, 12, 9, 8]
第三轮排序结果为: [4, 5, 8, 12, 9, 10]
第四轮排序结果为: [4, 5, 8, 9, 12, 10]
第五轮排序结果为: [4, 5, 8, 9, 10, 12]
代码
package com;
import java.util.Arrays;
/*
* 选择排序
*/
public class ArraySort02 {
public static void main(String[] args) {
int[] arr = { 8, 10, 5, 12, 9, 4 };
//遍历数组,将最小值的下标赋值给min
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[min] > arr[j]) {
min = j;
}
}
//交换位置
if (i != min) {
arr[i] = arr[i] ^ arr[min]; //使用异或,可以在不使用中间量的情况下,交换两个数的位置
arr[min] = arr[i] ^ arr[min];
arr[i] = arr[i] ^ arr[min];
}
System.out.println("第" + (i+1) + "轮排序后的数组:" + Arrays.toString(arr));
}
}
}
快速排序
快速排序就是先从数组中选择一个基准值(通常为数组中的第一个元素),然后把比基准值小的元素放到左边,大的放基准值右边,分完后对基准值两边的两个新数组进行重复的操作,
package com;
import java.util.Arrays;
public class ArraySort03 {
public static void main(String[] args) {
int[] buf = { 5, 8, 4, 11, 68, 15, 113 };
quicksort(buf);
System.out.println(Arrays.toString(buf));
}
public static void quicksort(int[] buf) {
quicksortsys(buf, 0, buf.length-1);
}
public static void quicksortsys(int[] buf, int sta, int end) {
int c = buf[sta]; //基准值
int i = sta;
int j = end;
int a = 0;
while (i < j) {
while (i < j) {
//判断数组右边的元素与基准值的大小
if (buf[j] < c) {
a = buf[i];
buf[i] = buf[j];
buf[j] = a;
i++;
break;
} else {
j--;
}
}
while (i < j) {
//判断数组左边的元素与基准值的大小
if (buf[i] > c) {
a = buf[i];
buf[i] = buf[j];
buf[j] = a;
j--;
break;
} else {
i++;
}
}
}
//使用递归, 对基准值两边的数组进行排序
if (i - sta > 1) {
quicksortsys(buf, sta, i - 1);
}
if (end - i > 1) {
quicksortsys(buf, i + 1, end);
}
}
}