对于数组常用的就是排序算法:冒泡排序,选择排序,插入排序
冒泡排序:
先理解后编程:9个数,外层需要8轮排序,内层每次都是从a[0]和a[1]比较开始,也就是相邻的两个比较。内层排序的轮数和外层的数字相关。
public static int[] sort(int[] arrays){
for(int i=0;i<arrays.length-1;i++){
for(int j=0;j<arrays.length-i-1;j++){
if(arrays[j]>arrays[j+1]){
int temp=arrays[j];
arrays[j]=arrays[j+1];
arrays[j+1]=temp;
}
}
}
return arrays;
}
冒泡排序运行都需要 O(N2) 时间级别。
其实无论何时,只要看见一个循环嵌套在另一个循环中,我们都可以怀疑这个算法的运行时间为 O(N2)级,外层循环执行 N 次,内层循环对每一次外层循环都执行N次(或者几分之N次)。这就意味着大约需要执行N2次某个基本操作。
选择排序:
选择排序是每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
9个数共需要8轮选择最小数,内层循环每轮从i+1开始,最后一个数结束,寻找最小值的下标
public static int[] chooseSort(int[] arrays){
for(int i=0;i<arrays.length-1;i++){
int min=i;
//拿到本轮中最小数的下表
for(int j=i+1;j<arrays.length;j++){
if(arrays[min]>arrays[j]){
min=j;
}
}
if(i!=min){
int temp=arrays[i];
arrays[i]=arrays[min];
arrays[min]=temp;
}
}
return arrays;
}
但是由于选择排序交换的次数少,所以选择排序无疑是比冒泡排序快的。
插入排序:
public static int[] insertSort(int[] arrays){
int j;
for(int i=1;i<arrays.length;i++){
int tmp=arrays[i];
j=i;
while(j > 0 && tmp < arrays[j-1]){//从已经排序的序列最右边的开始比较,找到比其小的数
arrays[j] = arrays[j-1];//向后挪动
j--;
}
arrays[j] = tmp;//存在比其小的数,插入
}
return arrays;
}