黑马程序员---java基础---1排序

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

排序

原理

1.排序,排序有很多中,在代码应用最多的排序,一般的是,选择排序,冒泡排序,插入排序,虽然一些排序效率很高,(例如:希尔排序)但一般应用较少而且难以理解

(1)选择排序
   它的原理是数组中的一个元素跟其他元素依次进行比较,来确定自己的位置。
 (2)冒泡排序
   它的原理是数组中的相邻的两个元素进行比较,比较出现大小,根据是升序还是降序交换位置,
   比较完一次就可以把数组的最后一位就确定(最大值或最小值)这样最后一位就不用参与比较,
   这样依次就可以排出数组顺序,相较于选择排序,冒泡较为提高效率
 (3)插入排序
   插入排序它的实现原理 通俗讲就是把数组元素看做一个有序表和一个无序表,
   开始有序表只包含一个元素,无序表中包含n-1个元素,排序过程中每次从无序表中取出第一个元素,
   把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
   也就是说
   (为了方便理解我就想是建立一个临时容器进行存储,但是数组类型,数组是一个不变长度的类型,这是不成立只是为了理解)


 

在实际开发中其实不这样用,用Arrays类排序,方便


代码体现
class Test1 
{
 public static void main(String[] args) 
 {
  //创建一个数组
  int[] arr= {3,1,4,2,7,5};
  //调用排序方法
  arr=insert(arr);
  //对排序后的数组进行打印
  System.out.print("int[] arr={");
  for (int i=0;i<arr.length;i++ )
  {
   //对数组角标位进行判断
   if(i!=arr.length-1)
    System.out.print(arr[i]+",");
   else
    System.out.println(arr[i]+"}");
  }
  
  
 }
//插入排序
 public static int[] insert(int[] arr)//封装成一个方法以便函数调用,
 {
  //遍历原数组,从角标1开始,因为当进行比较时,必须是两个元素比较大小的
  //0角标位上元素和1角标位上的元素。
  for (int x=1;x<arr.length ;x++ )
  {
   //这里这么定义只是为了好理解
   int value = arr[x];// 待插入的值
    int index = x;// 待插入的位置
   
   //循环判断条件比较大小,当index>0时,比较条件满足直接交换值,插入了值与此同时待插入的角标位重新赋值,角标位向前移动。
   while (index>0 && value<arr[index-1])
   {
    //定义第三方变量,插入值
     int temp=arr[index];   
                 arr[index]=arr[index-1];  //待插入的位置重新赋更大的值 
                 arr[index-1]=temp;   
                 index--;  //位置向前移动。
   }
  } 
        return arr; //返回一个数组以便对象调用。
 }
 //冒泡排序!
 public static void maoPao(int[] arr)
 {
  //外循环x控制的是比较的范围。角标不能自己跟自己比,所以想x<arr.length-1
  for (int x= 0;x<arr.length-1 ;x++ )
  {
   //内循环时,相邻的角标比,比出大小,交换位置,比完一次后,最值就出现在了最后一个角标上,
   //当第二次比较时y的范围就要缩小x,所以y<arr.length-x-1,每次的最值都会出现在被比较的最后一个角标上了
   //以此类推,一个有序的数组就出来了,
   for (int y=0;y<arr.length-x-1 ;y++ )
   {
    //比较相邻角标位上的值。
    if (arr[y]>arr[y+1])
    {
     //定义第三方变量,交换值。
     int temp = arr[y];
     arr[y]= arr[y+1];
     arr[y+1]=temp;
    }
   }
  }
 }
//选择排序
 public static void select(int[] arr)
 {
  //0角标上的元素依次与1角标、2角标...arr.length-1角标比较。
  //外循环控制的是 比较角标,内循环控制的是被比较角标。
  //外形循环直取到arr.leng-2角标,就不取了,因为arr.length-1角标不会自己跟自己比。
  //内循环,是被比较的角标,他首先是比外循环的角标要大1,这样被比较的角标和比较角标不会相同,而是相邻。
  //而且内循环被比较的角标是可以取到arr.length-1角标的
  for (int x= 0;x<arr.length-1 ; x++)
  {
   for (int y=x+1;y<arr.length ;y++ )
   {
    //判断大小,
    if (arr[x]>arr[y])
    {
     //定义第三方变量,交换值。
     int temp = arr[x];
     arr[x]= arr[y];
     arr[y]=temp;
    }
   }
  }
 }
}

 

画图体现
1.选择排序
数组中的一个元素跟其他元素依次进行比较,来确定自己的位置

 

插入

--------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! --------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值