java插入排序,冒泡排序,选择排序的思路及实现

本文通过两种不同的实现方式详细解析了插入排序算法,同时对比了冒泡排序和选择排序,旨在帮助初学者更好地理解并掌握插入排序的基本原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插入排序理解起来确实比冒泡排序,选择排序难一些,但是这个算法的效率要高于两者。本人小白一个就是在选择排序的地方浪费了一天的时间,现在把自己的琢磨的思路分享给大家,希望会帮助和我一样刚起步的小白同学。

插入排序的函数实现:
 
import java.util.Arrays;
class charu 
{
public static void main(String[] args) 
{
int[] a={10,4,7,5,3,6,8,9};
//a=Arrays.copyOf(a,a.length+1);
chaRu(a);
}
        思路一:
public static void chaRu(int[] a)
{
 for (int i=0;i
 {//i控制循环次数,j控制每次循环中循环的次数和执行条件。
//第一轮,拿a[1]和a[0]比,比较一次,把最小的放在了首位,
  //第二轮拿拿a[2]和a[0]和a[1]比,比较2次,第二小的放在第二位。     
  //开始第二轮,i变成1,也就是从a[1]开始重复,所以j开始的位置为i+1;
   //……重复a.length-1轮
           //因为j左边是有序数列,所以a[j]和a[j-1]从后往前比省些代码,
  //否则int  a[i]=min;
 for (int j=i+1;j>0;j-- )
 {
 if (a[j]
 {
 int t=a[j];
 a[j]=a[j-1];
 a[j-1]=t;
 }

 }System.out.println(Arrays.toString(a));//写在这里是可以详细看排序过程,写在主函数里面得结果。
 }
} //当然这一种严格来说并不是插入方式,是冒泡的变形。插入省去了交换的步骤,简单些。
思路二:
        public static void charu(int[]a)

{   int i,j,t;
for ( i =1;i
{ t=a[i];  //t相当于取出的作为插入的数,然后与前面的比较,比所比较的数小,该数就后移。然后t比较前一个数,如果t还小,所比较的数也后移。直到t大于所比较的数,把t插入到所比较的数后面。
for (j=i-1;j>=0 ;j-- )//可以把条件限定为j>0&&t
{
if(t
a[j+1]=a[j];//a[j]的值赋给a[j+1],相当于后移一位。
else break;//不写else
//t>a[j]怎么做?执行时就会得不到想要的结果
}a[j+1]=t;//此时的j最坏已经自减到了0。所以其实是a[1]=t;
System.out.println(Arrays.toString(a));
}
}

}

附带冒泡排序 用函数和不用函数的写法:
import java.util.Arrays;
class  maopao

 public static void main(String[] args)
 
        int[] a ={10,8,7,5,3,6,4,9};
   long start =System.currentTimeMillis();
maopao(a);
long end =System.currentTimeMillis();
System.out.println(end-start);//这是测试函数。可以下面两端程序的效率,你会发现内层循环的限定条件不一样,执行效果一样,但是效率不一样。显然第一种重复比较了已经放置好的最大数。

 }
 public static void maopao(int[] a)
 {
      int i,j;
  for (i=0;i
  
   for (j=0;j
   {
    if(a[j]>a[j+1])
    {int t =a[j];
    a[j]=a[j+1];
    a[j+1]=t;}
   }System.out.println(Arrays.toString(a));
  
 
 }
 
}

附带选择排序 用函数和不用函数的写法
//两个相邻的依次比较,选出大的放最后面,第二轮选出次大的放倒数第二位。
import java.util.Arrays;
class xuanze
{
 public static void main(String[] args)
 { //int i ;
  int[] a={10,8,7,5,3,6,4,9};
  xuanze(a);
  
  }
  
  public static int[] xuanze(int[]a)
 {
    //选出最小的放在首位,第二轮选出次小的放第二位a[i]和它后面的依次比较。重复a.length-1轮
  for ( int i=0;i
  {
   for (int j=i+1;j
  //选择排序,j=i+1不是j=1,a[i]只需要和其后面的比较。否则i大于1时发生倒退比较。
   { if(a[i]>a[j])
    {
     int t=a[i];//i和j要看清
     a[i]=a[j];
     a[j]=t;
    }
  
   }System.out.println(Arrays.toString(a));
  
  }return a;
 }
   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值