目录
1.选择排序
-
选择排序的主要思想是寻找未排序中最小的元素加入到已有序列,直到未排序序列为空。有一无序数组,如下,现按照选择排序的规则进行升序排序:
-
现将该数组分为两个部分,第一部分为有序部分,第二部分为无序部分,在初始时,有序部分的元素数量为0,全部为无序部分:
-
首先在无序部分中寻找最小元素所在的位置,然后将其与第一位的元素交换:
-
其余的按照上述方法继续执行:
-
直到进行到所有无序部分的元素都被排序:
-
选择排序的特点是查询次数较多,元素位置变换较少,比较适合易于查询而移动较复杂的数据
public class SortTest {
public static void main(String[] args) {
int[] arr = {4, 6, 5, 3, 7, 1, 8, 2};
selectSort(arr);
}
private static void selectSort(int[] arr) {
//外层循环无序部分
for (int i = 0; i < arr.length; i++) {
int smallerIndex = i;//最初认为索引值为i的位置值为无序部分最小
//在无序部分找到最小值索引,并与i换位置
for (int j = i + 1; j < arr.length; j++) {
//无序部分j位置的值小于smallerIndex位置的值,就认为j就是无序部分最小值索引,把j赋值给smallerIndex
if (arr[smallerIndex] > arr[j]) {
smallerIndex = j;
}
}
//相等无需换位置
if (smallerIndex != i) {
//值互换位置
int temp = arr[i];
arr[i] = arr[smallerIndex];
arr[smallerIndex] = temp;
}
}
for (int i : arr) {
System.out.print(i);
}
}
}
arr[i]=arr[smallerIndex];
arr[smallerIndex]=arr[i];//值会被覆盖,不可采用
2.冒泡排序
-
冒泡排序主要的思想是进行相邻的两个元素之间比较并且交换,有利于利用原有元素在集合中的位置优势,冒泡排序的原则是大的下沉小的上浮(跟最终的排序要求保持一致)
-
仍然对之前的数据按照冒泡进行排序:
-
第一轮的排序,首先比较前两个元素,如果顺序与升序相反则交换,否则什么也不做:
-
然后,依次比较第二位与第三位,第三位与第四位,…..
-
第一轮的排序:
public class SortTest {
public static void main(String[] args) {
int[] arr = {4, 6, 5, 3, 7, 1, 8, 2};
bubbleSort(arr);
}
private static void bubbleSort(int[] arr) {
//外层循环控制几轮大数下沉
for (int i = 0; i < arr.length - 1; i++) {
//每轮操作要让数据两两比较并且交换位置,大数下沉,里层循环完毕,有一个大数下沉,有序(有序部分+1,无序部分-1)了
//都是对无序部分进行两两比较交换下沉
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i : arr) {
System.out.print(i);
}
}
}
3.插入排序
-
插入排序与选择排序类似,需要将数组分为有序与无序两部分。但插入不会去到无序部分选择,而是随意选取一个无序部分元素到有序部分中寻找它所在的位置进行插入保持有序部分仍然有序,如果要对数据进行排序:
-
首先认为第一个元素部分为有序部分:
-
选取无序部分的第一个元素,到有序部分中寻找位置并插入:
-
其后依次进行
-
插入排序:
public class SortTest {
public static void main(String[] args) {
int[] arr = {4, 6, 5, 3, 7, 1, 8, 2};
insertSort(arr);
}
private static void insertSort(int[] arr) {
//无序部分,索引0默认有序
for (int i = 1; i < arr.length; i++) {
int current = arr[i];
//有序部分,current值插入有序序列中,结果仍然保持有序
for (int j = i - 1; j >= 0; j--) {
if (arr[j] > current) {
arr[j + 1] = arr[j];
} else {
arr[j + 1] = current;
break;
}
if (j == 0) {
arr[j] = current;
}
}
}
for (int i : arr) {
System.out.print(i);
}
}
}
-
Java中已经实现了数组排序的方法(Arrays.sort()),该方法不仅可以对数字类型数据进行排序,还可以通过提供比较器的方式对对象数组进行排序