排序原理
冒泡排序
冒泡排序
- 核心思想
依次拿相邻运算作比较
-
图解
-
使用java打印出比较过程
int[] arr={1,4,8,9,0,2};
//打印效果
/*
arr[0]-arr[1] arr[1]-arr[2] arr[2]-arr[3] arr[3]-arr[4] arr[4]-arr[5]
arr[0]-arr[1] arr[1]-arr[2] arr[2]-arr[3] arr[3]-arr[4]
arr[0]-arr[1] arr[1]-arr[2] arr[2]-arr[3]
arr[0]-arr[1] arr[1]-arr[2]
arr[0]-arr[1]
*/
//二维图形:两层for循环
//外层for循环控制行数 内层for循环控制本行的列数
//分析:每次比较的两个元素:前一个元素如果是arr[i] 后一个元素就是arr[i+1]
for(int i=0;i<arr.length-1;i++){//共arr.length-1行
for(int j=0;j<arr.length-i-1;j++){//让arr[j]作为前面的元素 arr[j+1]是后面的元素
//打印
System.out.print("arr["+j+"]-arr["+(j+1)+"]\t");
}
System.out.println();
}
- 把打印更改为比较即可
int[] arr={1,4,8,9,0,2};
//打印当前数组
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+(i==arr.length-1?"\n":","));
}
//把打印更改为比较即可
for(int i=0;i<arr.length-1;i++){//共arr.length-1行
for(int j=0;j<arr.length-i-1;j++){//让arr[j]作为前面的元素 arr[j+1]是后面的元素
if(arr[j]<arr[j+1]){
int k=arr[j];arr[j]=arr[j+1];arr[j+1]=k;
}
}
}
//打印当前数组
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+(i==arr.length-1?"\n":","));
}
选择排序
顺序排序
- 概念
顺序排序:依次拿当前元素何其后面的所有元素做比较
- 图解
- 使用代码模拟打印的效果
int[] arr={9,1,3,6,8,2};//要求从小到大排序
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+(i==arr.length-1?"\n":","));
}
//打印的效果
/*
* arr[0]-arr[1] arr[0]-arr[2] arr[0]-arr[3] arr[0]-arr[4] arr[0]-arr[5]
* arr[1]-arr[2] arr[1]-arr[3] arr[1]-arr[4] arr[1]-arr[5]
* arr[2]-arr[3] arr[2]-arr[4] arr[2]-arr[5]
* arr[3]-arr[4] arr[3]-arr[5]
* arr[4]-arr[5]
* */
for(int i=0;i<arr.length-1;i++){//外层for循环记录当前元素的下标:
//System.out.println("当前元素:arr["+i+"]");
for(int j=i+1;j<arr.length;j++){
//arr[i]是当前元素
//arr[j]是当前元素后面的元素
//拿arr[i]和arr[j]比较
System.out.print("arr["+i+"]-arr["+j+"] ");
}
System.out.println();//打印换行
}
- 把打印更改为比较即可
冒泡排序与顺序排序的区别
//顺序排序:依次拿当前元素何其后面的所有元素做比较
int[] arr={9,1,3,6,8,2};//要求从小到大排序
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+(i==arr.length-1?"\n":","));
}
//把打印更改为比较
for(int i=0;i<arr.length-1;i++){//外层for循环记录当前元素的下标:
for(int j=i+1;j<arr.length;j++){
//arr[i]是当前元素
//arr[j]是当前元素后面的元素
//拿arr[i]和arr[j]比较
if(arr[i]<arr[j]){
int k=arr[i];arr[i]=arr[j];arr[j]=k;
}
}
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+(i==arr.length-1?"\n":","));
}
//冒泡排序
for(int i=0;i<arr.length-1;i++){//共arr.length-1行
for(int j=0;j<arr.length-i-1;j++){//让arr[j]作为前面的元素 arr[j+1]是后面的元素
if(arr[j]<arr[j+1]){
int k=arr[j];arr[j]=arr[j+1];arr[j+1]=k;
}
}
}
//顺序排序
for(int i=0;i<arr.length-1;i++){//共arr.length-1行
for(int j=i+1;j<arr.length;j++){//arr[i]作为当前元素 arr[j]作为当前元素后面的元素
if(arr[j]<arr[i]){
int k=arr[j];arr[j]=arr[i];arr[i]=k;
}
}
}
/*
分析:
外层for循环变量i 都是从0开始到length-2:轮数相同 都是length-1轮
内层for循环变量j
冒泡排序:j从0开始到length-i-2 取值:length-i-1
顺序排序:j从i+1开始到length-1 取值:length-i-1
比较的元素:
冒泡排序:arr[j]和arr[j+1]比较
顺序排序:arr[i]和arr[j]比较
*/
插入排序
插入排序
- 核心
插入排序:假设前面元素是有序的:拿当前元素倒着和前面的元素做比较
- 代码
public static void main(String[] args) {
//插入排序:假设前面元素是有序的:拿当前元素倒着和前面的元素做比较
int[] arr={1,4,0,4,5,6,7,9,0,1};
print(arr);
paiXu(arr);
print(arr);
}
public static void paiXu(int[] array){
for(int i=1;i<array.length;i++){
//定义变量记录当前元素的值
int k=array[i];
int j;
for(j=i-1;j>=0;j--){//倒着比较
if(array[j]>k){
array[j+1]=array[j];//前面的元素后移一位
}else{
break;//找到k的正确位置 j+1
}
}
array[j+1]=k;
}
}
public static void print(int[] arr){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+(i==arr.length-1?"\n":","));
}
}