数据结构之二分法以及八大排序算法的理解与代码实现(Java)

二分法

      顾明思意,二分法就是将我们的数组一分为二,然后拿我们要查找的数去和中间的那个元素比较,如果刚好等于中间那个元素,那么就返回中间位置的下标。如果比中间的元素小,那么再使用相同的方式从中间元素的前面部分去找;相反如果比中间元素更大,那么就在中间元素后面的部分去找。如此循环,这样就叫二分法,相信大家都意识到了,二分法之所以能这样做的前提是:数组已经是有序的(通常情况下是升序)。下面看一下二分法的具体实现:

在这里插入图片描述
以上图片就是整个二分法的实现过程,从上面可以看出,二分法排序关键是要确定中间元素的下标,那么中间元素的下标怎么来确定呢?在我们初始化的时候,定义一个整形变量start和一个end,分别指向数组的头和尾,那么中间元素的下标就是:(start + end)/2,然后比较中间元素和要查找元素的大小。如果此时中间的元素等于要查找的元素,那么就直接返回下标。如果要查找的元素比中间元素小,那么让end = middle - 1;相反,如果比中间元素大的话,就让start = middle + 1。 为什么要这样做呢,我们仔细想一想,中间元素的下标是不是每次都在变,而middle = (start + end) / 2,所以start 和end 实际上就是用来控制middle的。利用循环来使middle不断地改变,直到start < end的时候结束。下面是具体代码实现:

/**
array:被查找的数组,默认升序
number:被查找的元素
*/

public int EFSort(int[] array,int number){
   
     //定义起始位置
     int start = 0;
     //定义结束位置
     int end = array.length - 1;
     while(start < end){
   
     //每次循环让 中间元素下标等于(start + end) / 2 
      int middle = (start + end) / 2;
     //如果要查找的元素和中间元素相等,直接返回middle
      if(array[middle] == number){
   
         return middle;
       }else{
   
        //如果中间元素比number大,那么去前面找
         if(array[middle] > number){
   
            end = middle - 1;
          }else{
   
            //否则就去后面找
            start = middle + 1;
           }
       }
     }
     return -1;
}

排序算法之:冒泡排序

   冒泡排序的原理其实非常简单:当我们拿到一个数组过后,从头开始,第一个元素与第二个元素比较,把大的放后面,小的放前面;然后第二个元素与第三个元素比较,大的放后面,小的放前面;然后第三个与第四个比较;第四个与第五个比较......如此下去直到把数组中最大的那个数放到数组的末尾。这样就完成了第一堂冒泡排序。然后进行下一轮比较,这时,上一轮比较出来的最大的元素就不用参与比较了。所以冒泡排序每轮的比较次数都在减少。看一个例子:
   数组array[4,5,2,1,9,8,6]
   第一趟:4和5比,不要用交换;5和2比,交换[4 , 2 , 5 , 1 , 9 , 8 , 6] ;5和1比:交换[4 , 2 , 1 , 5 , 9 , 8 , 6] ;5和9比,不用交换;9和8比,交换[4 , 2 , 1 , 5 , 8 , 9 , 6] ;9和6比,交换[4 , 2 , 1 , 5 , 8 , 6 , 9];这样第一趟就把最大的元素排到了最后面,可以看出第一次只比较了6次
   第二趟:4和2比,交换[2 , 4 , 1 , 5 , 8 , 6 , 9];4和1比,交换[2 , 1 , 4 ,  5 , 8 , 6 , 9];4和5比,不用交换;5和8比,不用交换;8和6比:交换[2 , 1 , 4 , 5 , 6 , 8 , 9];8就不用和9比,所以比较次数比上一轮少一次。
   第三趟、第四趟.......这样数组最终会被排序成[1 , 2 , 4 , 5 , 6 , 8 , 9]
public int[] bubbleSort(int[] array){
   
//第一堂的比较次数最多:array.length - 1
   for(int i = 0;i < array.length - 1;i++){
   
     //每一趟的比较次数都比上一次少1
     for(int j = 0;j<array.length -1 - i;j++){
   
           if(array[j] > array[j+1]){
   
               int temp = array[j+1];
               array[j+1] = array[j];
               array[j] = temp;
           }     
     }
   }
   return array;
}

排序算法之:快速排序

   快速排序很多时候称之为快排,他的核心思想呢就是:定义一个标准数,然后比标准数小的全部放在数组左边,比标准数大的全部放在数组右边(当然也可以反过来)。通常情况下我们将数组的第一个元素作为一个标准数,然后再用两个变量start、end分别指像数组的头和尾,因为标准数定义在数组的第一个元素,所以我们从右边开始遍历数组当遇到比标准数小的时候我们就执行 array[start] = array[end];然后从左边开始遍历找到比标准数大的元素执行:array[end] = array[start]; 注意遍历的时候如果不满足条件就start ++ 或则end --。 最后start和 end 相等。这时就把之前定义的标准数放在这儿:array[start] = 标准数。
   比如有一个数组:array [2,8,6,1,0,3,7,4];
           1、标准数:int stand = array[0];   //stand = 9
           2、start = 0,end = array.length - 1;
           while(start < end){
                //从右边开始,直到找到比标准数小的
                while( array[end] >=stand && start < end ){
                     end--;
                 }
                 //while循环结束后,表示已经找到比标准数小的数了,所以现在要做的就是把这个值赋给 start 所指向的地方
                 array[start] = array[end];
                 //然后从左边开始,直到找到比标准数大的,放在数组右边
                 while( array[start] <= stand && start < end ){
                    start++;
                 }
                   //while循环结束后,表示已经找到比标准数大的数了,所以现在要做的就是把这个值赋给 end 所指向的地方
                   array[end] = array[start];
             
           }
           //最外层while循环结束,表示start = end
           这是用标准数来代替这个位置
     
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值