这次讲一个插入排序算法,首先了解一下插入排序的工作原理。假设现在拥有[5,2,8,17,4]这样的一个int数组。那么插入排序就会分成两个序列,一个是有序序列,另一个是无序序列。为了更直观的了解,我把他的每一步排序过程做了如下拆分:
(注意:以下排序过程中我会用绿色标注有序序列,红色标注无序序列。)
第一次排序默认把第一个元素认为是一个有序序列,其余的看作是无序序列:[5,2,8,17,4]。然后从无序序列中拿出第一个来跟前面有序序列中的进行比较(注意:比较过程是从有序序列的末尾向前进行的)。这时发现数字2小于数字5,所以把数字2放到有序序列中,并和数字5交换位置。由于数字5前面已经没有元素了,那么第一次排序结束。结果为[2,5,8,17,4]。
第二次排序还是从无序序列中取出第一个元素跟前面的有序序列比较(当前序列划分[2,5,8,17,4])。取出的数字把跟有序序列中的最后一个元素数字5进行比较。数字8不小于数字5,所以数字把放到有序序列中并排在数字5之后。结果为[2,5,8,17,4]。
最后重复以上动作,直至得到有个排序正确的int数组。
public static int[] insert(int[] list){
for(int i=1;i<list.length;i++){
for(int j=i-1;j>=0;j--){
if(list[j+1]<list[j]){
int listE1 = list[j+1];
int listE2 = list[j];
list[j+1] = listE2;
list[j] = listE1;
}else{
break;
}
}
}
return list;
}
以上就是插入排序的代码。根据惯例我对插入排序算法的性能做了如下测试。
int[] intArray ={5,2,8,17,4,83,34,62,2,46,79,3,9,15,64,76,7,24,45,88,44,84};
long star = System.currentTimeMillis();
for(int i=0;i<=500000;i++){
insert(intArray);
}
long end = System.currentTimeMillis();
System.out.println(end-star);
最终耗时40毫秒左右。
public static int[] sort1(int[] list){
for (int i=0;i<list.length;i++){
int k = 0;
for(int j=0;(j+i)<list.length-1;j++){
int listE1 = list[j];
int listE2 = list[j+1];
if(listE1 > listE2){
list[j]=listE2;
list[j+1]=listE1;
k++;
}
}
if(k==0){
return list;
}
}
return list;
}
下面是用来测试的代码:
int[] intArray ={5,2,8,17,4,83,34,62,2,46,79,3,9,15,64,76,7,24,45,88,44,84};
long star = System.currentTimeMillis();
for(int i=0;i<=500000;i++){
sort1(intArray);
}
long end = System.currentTimeMillis();
System.out.println(end-star);
最终耗时同样在40毫秒左右。
冒泡排序算法
最优时间复杂度:O(n)
最坏时间复杂度:O(n平方)
稳定性:稳定插入排序算法
最优时间复杂度:O(n)
最坏时间复杂度:O(n平方)
稳定性:稳定