简单排序
冒泡排序,选择排序,插入排序都是“就地”算法,除了使用的中间交换变量使用内存空间外,没有开辟额外的数组或列表空间,算法复杂度都是O(n^2)。核心思想都是对两个数做比较,如果符合条件就对两个数做交换。冒泡排序算法和插入排序算法在比较两个数的时候,如果把两数相等的条件也加上的话,那么此时实现冒泡排序和插入排序算法不能说是稳定的。因为相等的两个值彼此交换了。稳定排序的算法定义是值相等的元素的在排序之后的先后顺序和排序之前的先后顺序一样。比如,有数组a,其中a0和a1这两个元素相等。在排序前,a0在数组下标0的位置,a1在数组下标1的位置。在排序之后a1在数组下标0的位置,a0在数组下边1的位置,那么这个算法是不稳定的。选择排序,在每轮比较的结果是选择一个最大或最小的值,然后把这个值依次扎(一个萝卜一个坑似的,大萝卜扎大坑,小萝卜扎小坑)到数组下标0位置,第二大或第二小扎到数组下标1。a0 a1 a2 a3,a0与a1相等,a3小于a0,a2大于a3,那么在a1,a2,a3中,a3最小,a0和a3做交换,此时数组是a3 a1 a2 a0。排序前a0在a1前面,排序后a1在a0前面,因此选择排序不稳定。
package com.simple.sort;
/**
* @ClassName SortedApp
* @Author gg_girl
* @Date 2020/9/4
* @Description TODO
* @Version 1.0
*/
public class SortedApp {
public static void main(String[] args) {
int[] nums = {9,1,5,3};
// bubbleSort(nums);
// selectSort(nums);
insertSort(nums);
for(int i = 0; i < nums.length; i++){
System.out.print(nums[i] + " ");
}
System.out.println();
}
// 冒泡排序
// 复杂度O(n^2)
// 比较和移动次数
public static void bubbleSort(int[] nums){
for(int i = 0; i < nums.length; i++){
for(int j = i+1; j < nums.length; j++){
if(nums[i] > nums[j]){//比较
int tmp = nums[i];
nums[i] = nums[j]; //交换
nums[j] = tmp;
}
}
}
}
public static void selectSort(int[] nums){
int minIndex ;//最小值得下标
for(int i = 0; i < nums.length; i++){
minIndex = i;
for(int j = i + 1; j < nums.length; j++){
if(nums[j] < nums[minIndex]){// 比较
minIndex = j;
}
}
// minIndex和当前i做交换 O(n)
int tmp = nums[i];
nums[i] = nums[minIndex];
nums[minIndex] = tmp;
}
}
// 插入排序
// 已排序好一半
public static void insertSort(int []nums){
// i前面已排序好
for(int i = 1; i < nums.length; i++){
int j = i;
int mark = nums[i];
while (j > 0 && nums[j-1] > mark ){
// 比较,然后交换
nums[j] = nums[j-1];
j--;
}
nums[j] = mark;
}
}
}