1、冒泡排序
- 复杂度
O(n^2)
- 稳定,因为当相邻两个数字相同的时候,不会交换它们
- 思路就是每次将无序部分的最大的数沉到最后面
public void bubble(int[] nums){
for (int i = 0;i < nums.length;i++){
for (int j = 0;j < nums.length-i-1;j++){
if (nums[j] > nums[j+1]){
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
}
2、选择排序
- 复杂度
O(n^2)
- 不稳定:如8,8,2 排序后变为2,8,8,同样的8顺序反过来了
- 思路:从头到尾,每个位置i,把第i小的数直接换到对应的位置来
public void select(int[] nums){
for (int i = 0;i < nums.length-1;i++){
int minIndex = i;
for (int j = i+1;j < nums.length;j++){
if (nums[j] < nums[minIndex]){
minIndex = j;
}
}
int tmp = nums[minIndex];
nums[minIndex] = nums[i];
nums[i] = tmp;
}
}
3、插入排序
- 复杂度
O(n^2)
- 稳定
- 思路:像玩扑克牌一样,分为前段有序部分和后段无序部分,每次把无序部分的第一个数插到前段对应的位置上
public void insert(int[] nums){
for (int i = 1;i < nums.length;i++){
int val = nums[i];
int j = i;
while (j > 0 && nums[j-1] > val){
nums[j] = nums[j-1];
j--;
}
nums[j] = val;
}
}