// 冒泡排序--在一个不断缩小的范围内将相邻的两个数不断地两两交换,这导致最大的数放到数组后面
public static void insertSort(int[] arr){
for(int end=arr.length-1;end>0;end--)//每次排序的范围 一次排序后,最大值已确定且放到范围最后
for(int i=0;i<end;i++)
if(arr[i]>arr[i+1])
swap(arr[i],arr[i+1]);
}
//选择排序--在一个不断缩小的范围内,找到一个最小的数放到数组的前面
public static void insertSort(int[] arr){
for(int i=0; i<arr.length-1; i++){//每次找最小数的范围
int minIndex=i;//每次初始化的最小数的位置(范围的起始位置)
for(int j=i+1; j<arr.lenth; j++){
minIndex=arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr,i,minIndex);//交换找到的实际的最小数与刚才初始化的最小数
}
//插入排序--每次取一个未参与排序的数与之前已排好序的几个数从后往前比(小于则交换),找到自己的位置
//就像摸牌时将刚摸到的牌插到之前摸到且已排好序的手牌中
public static void insertSort(int[] arr){
if(arr==null || arr.length<2)
return ;
for(int i=1;i<arr.length;i++)//即将考察的数的下标
for(int j=i-1;j>=0 && arr[j]>arr[j+1];j--)
swap(arr,j,j+1);
}
选择排序和冒泡排序与数据状况无关,无论数据是否有序,都需要按部就班地完成排序;而插入排序与数据状况有关,若给定数据有序,则其时间复杂度为O(N);若给定数据是由大到小排列,则其时间复杂度为O(N^2)。
当一个算法的时间复杂度依据给定数据状况有好有坏时,则规定一律以最坏情况下的复杂度为该算法的时间复杂度。