1.冒泡排序:
用自己的话讲一下冒泡排序的过程:
事例:有一个数组 [6,10,5,8,4,3],对该数组进行冒泡排序,设计两层循环,第一层循环,用来遍历总循环的次数,第二层循环用来扫描各个元素的值
第一步:从第一个位置开始(指针直线6这个值),跟后一个位置(也就是第二个)的值比较,如果第二个值小于第一个值时,交换位置,并把指针+1,指向下一个位置。
第一步结束后,数组为 [6,10,5,8,4,3]
第二步:当前指针在第二位,也就是值为10的位置,5<10,所以交换位置,数组变为[6,5,10,8,4,3],交换值后,指针+1
第三步:当前指针在第三位,也就是值为8的位置,8<10, 所以交换位置,数组变为[6,5,8,10,4,3],交换值后,指针+1
第四步:当前指针在第四位,也就是值为4的位置,4<10, 所以交换位置,数组变为[6,5,8,4,10,3],交换值后,指针+1
第五步:当前指针在第五位,也就是值为3的位置,3<10, 所以交换位置,数组变为[6,5,8,4,3,10],此时指针到达最后一个位置了,跳出第二层循环,将外层循环的指针加一
代码:
public static int[] bubbleSort(int[] arr){ for(int i = 0;i<arr.length-1;i++){ for (int j = 0;j<arr.length-1;j++){ if(arr[j]>arr[j+1]){ //如果后面的值小于前面的值,就进行交换 int temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } } return arr; }
冒泡排序:最好的与最坏的情况下,遍历次数都一样,都是O(n^2)
2.插入排序:
用自己的话讲一下插入排序的过程:
事例:有一个数组 [6,10,5,8,4,3],对该数组进行插入排序:
第一步:从第二个位置开始(指针直线10这个值),跟前一个位置(也就是第一个)的值比较,如果第二个值小于第一个值时,交换位置,并把指针+1,指向下一个位置。
第一步结束后,数组为 [6,10,5,8,4,3]
第二步:当前指针在第三位,也就是值为5的位置,5<10,所以交换位置,数组变为[6,5,10,8,4,3],交换值后,前面有值,再跟前面的值对比,5<6,交换位置,数组变为[5,6,10,8,4,3],指针+1
第三步:当前指针在第四位,也就是值为8的位置,8<10,所以交换位置,数组变为[5,6,8,10,4,3],交换值后,前面有值,再跟前面的值对比,8>6,无需交换位置,指针+1
第四步:当前指针在第五位,也就是值为4的位置,4<10,所以交换位置,数组变为[5,6,8,4,10,3],交换值后,前面有值,再跟前面的值对比,4<8,交换位置,数组变为[5,6,4,8,10,3],
交换值后,前面有值,再跟前面的值对比,4<6,交换位置,数组变为[5,4,6,8,10,3],交换值后,前面有值,再跟前面的值对比,4<5,交换位置,数组变为[4,5,6,8,10,3],指针+1
第五步:当前指针在第六位,也就是值为3的位置,3<10,交换位置,数组变为[4,5,6,8,3,10],交换值后,前面有值,再跟前面的值对比,3<8,交换位置,数组变为[4,5,6,3,8,10],
前面有值,再跟前面的值对比,3<6,[4,5,3,6,8,10],前面有值,再跟前面的值对比,3<5,[4,3,5,6,8,10],前面有值,再跟前面的值对比,3<4,[3,4,5,6,8,10],此时指针已经是最大了,推出循环,
得到的就是插入排序后的数组[3,4,5,6,8,10]。
编写插入排序代码:
public class insertSort { public static int[] insertSortMethod(int[] arr){ //首先遍历数组,从第二位开始 for(int i = 1;i<arr.length;i++){ //再遍历一下数组,让指针在的值与数组前面的值依次对比 for(int j = i;j>0;j--){ if(arr[j]<arr[j-1]){ //如果后面的值小于前面的值,就进行交换 int temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp; }else{ break; } } } return arr; } public static void main(String[] args) { System.out.println("aaa"); int[] arr = {6,10,5,8,4,3}; int[] ints = insertSortMethod(arr); for (int i: ints) { System.out.print(i+","); } } }
插入排序的平均时间复杂度也是 O(n^2),空间复杂度为常数阶 O(1),具体时间复杂度和数组的有序性也是有关联的。
插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较 N-1 次,时间复杂度为 O(N)。
最坏的情况是待排序数组是逆序的,此时需要比较次数最多,最坏的情况是 O(n^2)。
3.