插入排序算法:
在一個(gè)有序的數(shù)組中插入一個(gè)數(shù)據(jù),要求該數(shù)據(jù)插入后數(shù)組仍然有序。在插入排序中有序的數(shù)組就是指已經(jīng)排好序的區(qū)間,新增的數(shù)據(jù)就是從未排序的區(qū)間中取出一條數(shù)據(jù)插入即可。
public static int[] insertSort(int[] numbers){
for(int i=1;i<numbers.length;i++){
int value = numbers[i];
int j = i-1;
for(;j>=0;--j){
if(numbers[j+1]>value){
numbers[j+1] = numbers[j];
}else{
break;
}
}
numbers[j+1]= value;
}
return numbers;
}
冒泡算法:
每一次都是從數(shù)組中的第一個(gè)元素跟下一個(gè)元素做對(duì)比,然后將最大或最小的數(shù)據(jù)放到最后。最終產(chǎn)生有序或倒敘的排序結(jié)果。
public static int[] popSort(int[] numerbers){
for(int i=0;i<numerbers.length;i++){
for(int j=0;j<numerbers.length-i-1;j++){
if(numerbers[j]>numerbers[j+1]){
int temp = numerbers[j];
numerbers[j] = numerbers[j+1];
numerbers[j+1] = temp;
}
}
}
return numerbers;
}
有序度
有序度是指數(shù)組中兩個(gè)數(shù)組元素之前是有序的個(gè)數(shù)。如數(shù)組 C : 2,4,3,1,2,7
有序的元素為:(2,4) (2,3) (2,2) (2,7) (4,7) (3,7) (1,2) (1,7) (2,7)。因此數(shù)組C目前的有序度為9。排好序的數(shù)據(jù)元素個(gè)數(shù)叫做滿有序度,數(shù)組C的滿有序度為 15 公式n(n-1)/2*,逆序度的定義正好跟有序度相反.
逆有序度=滿有序度-有序度
冒泡和插入排序的實(shí)質(zhì)就是數(shù)據(jù)在交換,每交換一次數(shù)據(jù)有序度就會(huì)加1.無(wú)論怎么交換,交換的次數(shù)是不變的。也就是逆序度不變。
因此冒泡排序和插入排序交換次數(shù)都是一樣的,但是冒泡排序在交換數(shù)據(jù)時(shí),需要三個(gè)賦值操作,而插入排序只有一個(gè)賦值操作。可以看出來(lái)冒泡排序比插入排序更加耗時(shí)。
關(guān)于插入排序目前還有一種更高效的排序方式,時(shí)間復(fù)雜都能夠提升到,可以使得性能提升至O(n log2 n)。
希爾排序可以研究一下