1.选择排序
时间复杂度为O(n^2) , 空间复杂度为O(n) 比较基础的遍历啦 思想是很容易的 , 将数组先遍历一遍(0 ~ length-1)找到最小的的值,将他放在第一位(索引为0), 继续交换剩余数组(1 ~ length -1) 将他和第二个数进行交换(索引为1)一直到条件不满足。 文字描述文化有限,我们来看看代码:
for(int i = 0 ; i < arr.length - 1 ; i++){
int minNum = arr[i];
for(int j = i + 1 ; j < arr.length ; j++){
int minNum = arr[i] < arr[j] ? i : j;
}
int temp = arr[i];
arr[i] = arr[minNum];
arr[minNum] = temp;
}
人话来说 就是挑最小值放在第一个 , 然后剩余的数挑一个最小的放在第二个… 最终完成排序。 简单吧!!
2.冒泡排序
下面这个也很简单,和选择排序有点像 都是 时间复杂度为 O(n^2) 空间复杂度为 O(1); 每一次比较将相邻的数进行比较将大的往后交换 , 就会在最后一位得到最大值 将剩下的继续进行比较,倒数第二个数就是最大的。依次类推得到排序好的数组啦 代码如下
for(int i = 0 ; i < arr.length -1 ; i++){
for(int j = 0 ; j < arr.length - 1 - i ; j++){
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
还是很简单的吧~~
3.插入排序
这会比上面两个排序好一点的排序,还是不算难 插入排序如同他的名字。 想象一下,你有一把的牌, 你要把他从小到大进行排序 首先你要保证第1张牌之前是整齐的(这不是废话吗,就1张。。。纯纯哥谭噩梦)然后呢,你就要保证前两张牌是排好序的(如果比第一个数小,就和他进行交换大于他就不进行交换)以此类推,每当你拿到新的牌,他之前的牌全是有序的,你只需考虑新牌应该排到哪里就好啦。 听懂我的故事了嘛,没听懂没关系哦~ 让我们一起看看源码吧
for(int i = 1 ; i < arr.length -1 ; i++){
for(int j = i - 1 ; j >= 0 && arr[j] > arr[j+1] ; j--){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
代码简单明了 其中第二个for循环有一丝丝难度(当然是对我)j表示已经排好序中最后一位
|