插入排序理解起来确实比冒泡排序,选择排序难一些,但是这个算法的效率要高于两者。本人小白一个就是在选择排序的地方浪费了一天的时间,现在把自己的琢磨的思路分享给大家,希望会帮助和我一样刚起步的小白同学。
插入排序的函数实现:
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)
{
//第一轮,拿a[1]和a[0]比,比较一次,把最小的放在了首位,
} //当然这一种严格来说并不是插入方式,是冒泡的变形。插入省去了交换的步骤,简单些。
思路二:
{
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));
}
class
{
maopao(a);
long end =System.currentTimeMillis();
System.out.println(end-start);//这是测试函数。可以下面两端程序的效率,你会发现内层循环的限定条件不一样,执行效果一样,但是效率不一样。显然第一种重复比较了已经放置好的最大数。
}
附带选择排序 用函数和不用函数的写法
//两个相邻的依次比较,选出大的放最后面,第二轮选出次大的放倒数第二位。
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;
class xuanze
{
}