排序问题
一:冒泡排序
1.冒泡排序是O(n^2)的时间复杂度,额外空间复杂度为O(1)
2.冒泡思想:每次找出一个最大值,放在最后一个位置,然后下次再找的时候,就忽略最后一个位置,然后将第二次的最大值放在倒数第二位,以此类推,当只剩下一个数字,就不需要再排了。
3.冒泡编程思路:第一层循环设置的是需要排序的终点,依次递减到1的位置,因为比较的过程是涉及到两个位置,所以不需要终点和起点重合,就可以比较完成,实际上起点不需要走到终点,只要走到终点-1的位置,就已经进行了比较了。,第二个循环从0一直到小于第一层设置的终点位置,不需要和终点重合,理由如上,第二层循环内,只要第i个数,比i+1大,就交换,保证将最终位置之前的最大值交换到最后位置。
4.代码:
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
//如果数组为空或者只要一个,就不用排序
return ;
}
for (int end = arr.length - 1; end > 0; end--) {
//end表示从后往前开始的排序好的数字
for (int i = 0; i < end; i++) {
//由于这是基于前一个数字,比较后一个数字,所以end所在位置的数字
//是最后也要用于比较的,所以不需要担心,end=arr.length-1的时候,最后一个位置无法比较的情况。
if (arr[i] > arr[i + 1]) {
//当第i个数比i+1大,就交换,目的就是将最大的数字,往后一直排
swap(arr,i,i+1);
}
}
}
}
public static void swap(int[] arr, int i, int j) {
//交换数组内的数
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
二:选择排序
1.选择排序的时间复杂度是O(n^2),额外空间复杂度O(1)
2.选择排序的思想:每次找出最小值,放在最第一个位置,然后从第二个位置开始找,第二个最小值放在第二个位置,依次类推,最后一个值,就放在他自己的位置
3.选择排序的编程思路:与冒泡相似,第一层循环,从0递增到倒数第二个位置(只剩下两个数的时候,假设第一个数是最小值,那么就已经会遍历到最后一个位置,就已经将倒数第二个数字和最后一个进行了比较,所以不需要走到尽头,只剩下一个数字的时候,它一定是,剩余没有排的数字里的最小值,因为只有它了,在之前的循环里,我们能够保证在它之前的所有值都比它小),第一层循环内,假设初始位置就是最小值,第二层循环是从第一层循环设置的初始位置开始,往下直到最后一个数字,只要比假设的最小值小,就交换(放到初始位置),然后直到结束。
4.代码:
public static void selectionSort(int[] arr) {
if (arr == null || arr.length < 2) {
return ;
}//数组为空或者只有一个数字,直接返回
for (int i = 0; i < arr.length - 1; i++