插入排序
1.基本思想
每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。
2.图解
图片来源:https://www.cnblogs.com/chengxiao/p/6103002.html
3.代码实现
public class InsertionSorting {
public static void main(String[] args) {
int arr[] = {10,8,15,7,6,12,3,4,17,19,9};
for(int i = 1; i < arr.length; i++){//把10看做排序好的记录,把右边的数插入
int j = i;
while(j > 0 && arr[j] < arr[j-1]){
swap(arr,j,j-1);
j--;
}
}
//遍历输出排序好的数组元素
for(int i : arr){
System.out.print(i+" ");
}
}
private static void swap(int[] arr, int j, int i) {
int temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
4.总结
简单插入排序在最好情况下,需要比较n-1次,无需交换元素,时间复杂度为O(n);在最坏情况下,时间复杂度依然为O(n*n)。但是在数组元素随机排列的情况下,插入排序要优于冒泡排序和选择排序。所以,虽然三个排序(冒泡、选择、插入)的时间复杂度都是O(n*n),但是插入排序是效率最高的。
冒泡排序
1.原理
对相邻的元素进行两两比较,如果顺序相反则进行交换,这样,每一轮排序会有一个最大或最小的元素浮到顶端,最终达到完全有序。
2.图解
3.代码实现
/**
* @author Daniel
* 冒泡排序进行数组元素排序
* 每次比较相邻的两个元素,经过每一轮排序,就会有一个大的数排在最后(每次都比较出最大的一个数)
*/
public class BubbleSortDemo {
public static void main(String[] args) {
int[] arr = {5,4,3,2,1};//静态初始化一个数组
//冒泡排序
for(int i = 0; i < arr.length-1; i ++) {//length个数需要length-1轮比较
for(int j = 0; j < arr.length - 1 - i; j ++) {//每次进行length-1-i次比较
if(arr[j] > arr[j + 1]) {//如果当前元素大于后面一个元素则进行交换
InsertionSorting.swap(arr,j,j+1);
}
}
}
for (int i : arr) {//遍历排序后的数组
System.out.print(i + " ");
}
}
}
4.总结
冒泡排序中,n个元素要进行n-1轮排序,第i次排序要比较n-i次。时间复杂度为O(n*n)
选择排序
1.原理
每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。
2.代码实现
public class SelectionSort {
public static void main(String[] args) {
int arr[] = {5,9,12,3,15,8};
for(int i = 0;i < arr.length - 1; i++){
int minindex = i;//每一轮比较假设第一个元素最小
for(int j = i+1; j < arr.length; j++){
if(arr[j] < arr[minindex]){//每一轮从左往右与第一个元素比较
minindex = j;
}
}
//判断当前最小元素的下标是否改变,若改变,交换值
if(minindex != i){
InsertionSorting.swap(arr, i, minindex);
}
}
//遍历输出排序后的数组元素
for(int i : arr){
System.out.print(i+" ");
}
}
}
3.总结
选择排序和冒泡排序一样,n个元素需要n-1轮排序,在最好情况下也就是数组完全有序的时候,无需任何交换移动,在最差情况下,也就是数组倒序的时候,交换次数为n-1次。综合下来,时间复杂度为O(n2)。
参考资料:https://www.cnblogs.com/chengxiao/p/6103002.html