已经完全掌握了冒泡排序和二分查找的同学,可以自己尝试学习选择、插入排序。不要求今天全部掌握,最近2-3天掌握即可!
1 选择排序
选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾,最终完成排序。
选择排序算法描述:
- 初始状态:无序区间为 Arr[0.1…n],有序区间为空;
- 第i==1趟排序开始,从无序区中选出最小的元素Arr[k],将它与无序区的第1个元素交换,从而得到有序区间Arr[0…i-1],无序区间Arr[i…n];
- 继续后面第i趟排序(i=2,3…n-1),重复上面第二步过程;
- 第n-1趟排序结束,数组排序完成。
选择排序过程如下图:
源码实现:
import java.util.Arrays;public class Test07_SelectSort {public static void main(String[] args) {//准备一个int数组int[] array = {5, 2, 6, 5, 9, 0, 3};System.out.println("排序前: "+ Arrays.toString(array));//插入排序selectionSort(array);//输出排序结果System.out.println("排序后: "+ Arrays.toString(array));}public static void selectionSort(int[] arr) {int len = arr.length;if(len <= 1)return;//外层循环控制总体排序次数for(int i = 0; i < len-1; i++) { int minIndex = i;//内层循环找到当前无序列表中最小下标for(int j = i + 1; j < len; j++) {if(arr[minIndex] > arr[j]) {minIndex = j;}}//将无需列表中最小值添加到 有序列表最后位置if(minIndex != i) {arr[minIndex] = arr[minIndex] ^ arr[i];arr[i] = arr[minIndex] ^ arr[i];arr[minIndex] = arr[minIndex] ^ arr[i];}//System.out.println(Arrays.toString(arr));}}
}
2 插入排序
插入排序(Insertion Sort),一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。
插入排序算法描述:
- 将数组分成两部分,已排序、未排序区间,初始情况下,已排序区间只有一个元素,即数组第一个元素;
- 取未排序区间中第一个元素,插入到已排序区间中合适的位置,这样子就得到了一个更大的已排序区间;
- 重复这个过程,直到未排序区间中元素为空,算法结束。
插入排序过程见下图:
源码实现:
import java.util.Arrays;public class Test07_InsertSort { public static void main(String[] args) {//准备一个int数组int[] array = {5, 2, 6, 5, 9, 0, 3};System.out.println("排序前: "+ Arrays.toString(array));//插入排序insertionSort(array);//输出排序结果System.out.println("排序后: "+ Arrays.toString(array));}public static void insertionSort(int[] arr) {int len = arr.length;if(len <= 1) {return;}//外层循环控制 总体循环次数for(int i = 1; i < len; i++) {//内层循环做的事情:将无序列表中第一个元素插入到有序列表中合适位置int value = arr[i];//获取有序列表中最后一个元素下标int j = i - 1;for(; j >= 0; j--) {if(value < arr[j]) {arr[j+1] = arr[j];}else {break;}}//将需要插入的元素 放置到合适位置arr[j+1] = value;//一次排序完成后,输出 方便 观察System.out.println(Arrays.toString(arr));}}
}