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

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

插入排序的函数实现:
 
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、付费专栏及课程。

余额充值