以下所说排序都是从小到大的排序。
冒泡排序:从第一个数开始,每相邻两个数进行比较,将大的数放在后面;经过一次遍历比较,就会发现最大的数在整个数组中的最后面;然后再将剩下的数(不包括最后位置最大的那个数)再进行一次这样的遍历比较,从第一个数开始,每相邻两个数进行比较,就会发现剩下的数中的最大的数,会跑到整个数组中的倒数第二个位置;以此循环遍历。
如图:
private static void bubbleSort(int[] array){
//将最大的数往后冒
//外层循环控制循环的次数
for (int i=0;i<array.length;i++){
//内层循环,每两个相邻的数进行比较
for(int j=0;j<array.length-1;j++){
//如果前面的数大于后面的数,就进行交换
if(array[j]>array[j+1]){
//交换位置
int t=array[j];
array[j]=array[j+1];
array[j+1]=t;
}
}
}
}
插入排序:将一个数插入到有序部分中,将这个数与有序部分中的数依次从后面开始进行比较,找到其合适的位置进行插入。
private static void insertSort1(int[] array){
//将一个数插入到有序部分中
//有序部分[0,i) 无序部[i,array.length)
for(int i=0;i<array.length;i++){
//将要插入的数array[i]与有序部分中的数依次从后面进行比较,看其应该插在哪里
int j;
for( j=i-1;j>=0;j--){
if(array[j]<array[i]){
//array[j]<array[i] 说明array[i]所在的位置就是正确的,也不用再与前面的数进行比较了
break;
}
}
//一直到array[i]不小于array[j]了,将(j,i)中间的数后移,然后将array[i]换到array[j]位置的后一个位置array[j+1]处,
int t=array[i];
int k;
//将(j,i)中间的数后移
for( k=i-1;k>j;k--){
array[k+1]=array[k];
}
array[k+1]=t;
}
}
或者另一种写法:
//边找边插入
private static void insertSort2(int[] array){
for(int i=0;i<array.length;i++){
//将要插入的数与有序部分中的数依次从后面进行比较,看其应该插在哪里
int j;
int t=array[i];
for( j=i-1;j>=0;j--){
if(array[j]<t){
//array[j]<array[i] 说明array[i]所在的位置就是正确的,也不用再与前面的数进行比较了
break;
}else{
//将前一个数后移
array[j+1]=array[j];
}
}
array[j+1]=t;
}
}
选择排序:从无序部分中找出最大的一个数,将其放在无序部分的最后一个位置(即 将最大的那个数与最后一个数互换位置),则无序部分长度减1;下一次,再从无序部分中找出最大的一个数放在无序部分的最后,无序部分长度再减1;以此循环。
private static void selectSort(int[] array){
//从无序的所有的数里面选择一个最大的数放在无序部分中最后一个位置
//无序部分[0,array.length-i) 有序部分[array.length-i,array.length)
for(int i=0;i<array.length;i++){
int max=0;
for(int j=1;j<array.length-i;j++){
if(array[j]>array[max]){
max=j;//通过内部循环,找出最大的数的坐标
}
}
//将最大的数放在数组中无序部分的的最后一个位置
//即 无序部分中将最大的数与最后一个数互换位置
int t=array[array.length-i-1];
array[array.length-i-1]=array[max];
array[max]=t;
}
}