3.排序:经典排序算法原理解析与优劣对比
二分查找要求原数组必须有序
由无序到有序,是算法领域常见的一类问题,常用的排序算法有冒泡排序、插入排序、归并排序以及快速排序
3.1什么是排序问题
排序–让一组无序数据变成有序的过程,一般默认这里的有序都是从小到大的排列顺序
衡量一个排序算法的优劣:
1.时间复杂度–具体包括,最好时间复杂度、最坏时间复杂度以及平均时间复杂度
2.空间复杂度–如果空间复杂度为1,也叫做原地排序
3.稳定性–指相等的数据对象,在排序之后,顺序是否能保证不变
3.2冒泡排序
3.2.1冒泡排序的原理
从第一个数据开始,一次比较相邻元素的大小。如果前者大于后者,则进行交换操作,把大的元素往后交换。通过多轮迭代,直到没有交换操作为之。
3.2.2冒泡排序性能
最好时间复杂度是O(n)
也就是当输入数组刚好是顺序的时候,只需要挨个比较一遍就可以
冒泡排序的最坏时间复杂度是O(nn)
也就是当数组刚好是完全逆序的时候,每轮(排序都)需要挨个比较n次,并且重复n次
当输入数组杂乱无章时,它的平均复杂度是O(nn)
空间复杂度为O(1)
public static void main(String[] args){
int[] arr = {
1,0,3,4,5,-6,7,8,9,10};
System.out.println("原始数据" +Arrays.toString(arr));
boolean isAsc = true;
for(int i = 1 ; i < arr.length; i++){
for(int j = 0;j<arr.length - i; j++){
if(arr[j] >arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
3.3插入排序
3.3.1插入排序的原理
选取未排序的元素,插入到已排序区间的合适位置,直到未排序区间为空。
3.3.2插入排序的性能
插入排序最好的时间复杂度是O(n)
即当数组刚好是完全顺序的时候,每次只用比较一次就能找到正确的位置区间
插入排序最坏时间复杂度则需要O(NN)
即当数组刚好是完全逆序时,每次都要比较n次才能找到正确的位置区间
插入排序的平均时间复杂度是O(nn)。因为往数组中插入一个元素的平均时间复杂度为O(n)
而插入排序可以理解为重复n次的数组插入操作
空间复杂度为O(1)。冒泡排序过程当中,当元素相同时不做交换,所以冒泡排序是稳定的排序算法。代码如下:
public static void