【复习笔记】手写三种O(n^2)的基础排序算法

时间:2021-09-25 22:17:32

1.冒泡排序,稳定排序。

public static void bubbleSort(int [] array){
		
		int len = array.length;
		
		for(int i = 0; i < len - 1; ++i){
			boolean canBreak = true;
			for(int j = 0; j < len - i - 1; ++j){
				if(array[j] > array[j + 1]){
					canBreak = false;
					swap(j, j + 1, array);
				}
			}
			if(canBreak) break;
		}
	}

2.插入排序,稳定排序。且当元素数组接近有序时,性能较好,为O(n)

public static void insertSort(int [] array){
		
		int len = array.length;
		
		for(int i = len - 2; i >= 0; --i){
			
			int insertIndex = -1;
			for(int j = len - 1; j >= i; --j){
				if(array[i] > array[j]){
					insertIndex = j;
					break;
				}
			}
			
			if(insertIndex == -1) continue;
			int temp = array[i];
			
			for(int j = i; j < insertIndex; ++j){
				array[j] = array[j + 1];
			}
			array[insertIndex] = temp;
		}
	}

3.选择排序,非稳定排序。复杂度基本上为O(n^2)不会变,因为总要遍历一遍去寻找最大值。

public static void chooseSort(int [] array){
		
		int len = array.length;
		
		for(int i = len - 1; i > 0; --i){
			int maxIndex = 0;
			for(int j = 0; j <= i; ++j){
				if(array[j] > array[maxIndex])
					maxIndex = j;
			}
			swap(maxIndex, i, array);
		}
	}