import java.util.Arrays;
public class InsertSortDemo {
public static void main(String[] args) {
int[] ary={5,8,63,8,9,1,3,2,45,12};
int[] ary1=selectSort(ary);
int[] ary2=insertSort(ary);
int[] ary3=bubbleSort(ary);
System.out.println(Arrays.toString(ary1));
System.out.println(Arrays.toString(ary2));
System.out.println(Arrays.toString(ary3));
}
// 一: 选择排序
// 原理:
// a 将数组中的每个元素,与第一个元素比较如果这个元素小于第一个元素, 就将这个 两个元素交换.
// b 每轮使用a的规则, 可以选择出一个最小元素 放到第一个位置.
// c 经过n-1轮比较完成排序
// 简单说: 每轮选择最小的放到前面.
public static int[] selectSort(int[]ary){
int count=0;
for(int i=0;i<ary.length-1;i++){
for(int j=i+1;j<ary.length;j++){
if(ary[i]>ary[j]){ //将小的数往前移,第一轮将最小的移到到第一个位置,然后继续第二轮比较
int temp=ary[i];
ary[i]=ary[j];
ary[j]=temp;
}
count++;//计算运算了多少次!
}
}
System.out.println(count);
return ary;
}
// 二: 插入排序
// 第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素
// 在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置
public static int[] insertSort(int[] ary){
int count=0;
for(int i=1; i<ary.length; i++){
int temp = ary[i];
int j;
for(j=i-1; j>=0; j--){
if(temp<ary[j]){
ary[j+1] = ary[j];//移动 ary[j]->ary[j+1];留出下标j的位置让temp插入
count++;
}else{
count++;
break;
}
}
ary[j+1]=temp;//插入 temp -> ary[j+1]是因为for循环中j--,所以跳出循环时j的值是j-1
//就应该把temp的值赋给ary[j+1]
}
System.out.println(count); //计算运算次数
return ary;
}
// 三: 冒泡排序
// 原理: a 逐一比较数组中相邻的两个元素, 如果后面
// 的数字小于前面的数字, 就交换先后元素.
// b 经过一个轮次的比较, 一定有一个最大的排
// 在最后的位置.
// c 每次比较剩下的元素, 经过n-1次比较, 可以
// 实现排序
// 简单说: 比较交换相邻元素,每次最大的漂移到最后
public static int[] bubbleSort(int[] ary){
int count=0;
for(int i=0;i<ary.length-1;i++){
boolean tap=false;
for(int j=0;j<ary.length-i-1;j++){
if(ary[j]>ary[j+1]){//相邻两数进行比较,大的就移动到后面去!
int temp=ary[j];
ary[j]=ary[j+1];
ary[j+1]=temp;
tap=true;
}
count++;//计算运算了多少次!
// System.out.println(Arrays.toString(ary));
}
if(!tap){
break;//如果j 与 j+1没有交换,跳出循环!
}
}
System.out.println(count);
return ary;
}
}