时间复杂度:
在一段逻辑中,找到会必然发生并且重复执行的代码,将这段代码的执行时间看作单位1,考虑随着元素个数增多,单位1的执行次数
在时间复杂度中,一般不考虑系数,除非系数足够大,能够影响变化趋势
在时间复杂度中,一般考虑影响最大的一项
冒泡/选择排序的时间复杂度:O(n^2)
二分查找的时间复杂度:O(logn)
稳定性:
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
package com.sort; import java.util.Arrays; public class Sort { public static void main(String[] args) { int[] array = {2,5,9,8,6,5,7,3}; System.out.println(Arrays.toString(bubbleSort(array))); System.out.println(Arrays.toString(selectionSort(array))); System.out.println(Arrays.toString(insertSort(array))); } /** * 冒泡排序 * 算法原理: * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。 在这一步,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 */ public static int[] bubbleSort(int[] array){ if(array.length == 0){ return array; } for(int i = 0; i < array.length - 1; i++){ for(int j = 0; j < array.length-1-i; j++){ if(array[j]>array[j+1]){ int temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } } } return array; } /** * 选择排序 * 算法原理: * 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 * 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾 * 以此类推,直到所有元素均排序完毕 */ public static int[] selectionSort(int[] array){ if(array.length == 0){ return array; } for(int i = 0; i < array.length; i++){ int minIndex = i; for(int j = i; j < array.length; j++){ if(array[j]<array[minIndex]){ minIndex = j; } } int tmp = array[minIndex]; array[minIndex] = array[i]; array[i] = tmp; } return array; } /** * 插入排序 * 算法原理: * 把n个待排序的元素看成为一个有序表和一个无序表 * 开始时有序表中只包含一个元素,无序表中包含有n-1个元素 * 排序过程中每次从无序表中取出第一个元素 * 把它的排序码依次与有序表元素的排序码进行比较 * 将它插入到有序表中的适当位置使之成为新的有序表 */ public static int[] insertSort(int[] array){ if(array.length == 0){ return array; } for(int i = 1; i < array.length; i++){ int tmp = array[i]; //tmp为要插入的元素 int j = i - 1; //j为有序数组的最后一个元素的下标 while(j >= 0 && tmp < array[j]){ array[j+1] = array[j]; j--; } array[j+1] = tmp; } return array; } }
原文:https://www.cnblogs.com/jlsblog/p/12168665.html