查找和排序算法

1.二分查找(分治思想)

有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。

一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

public int binarysearch(int[] nums,int target){
        int left=0,right=nums.length-1;
        while(left<=right){
            int mid = (left+right)>>>1;
            if(nums[mid]<target){
                left = mid + 1;
            }else if(target<nums[mid]){
                right = mid -1;
            }else{
                return mid;
            }
        }
        return -1;
    }
算法时间复杂度:O(logN)

2.几种排序的方法

冒泡排序:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个,即需要进行length-1次。

第一次是对n个数进行n-1次比较,进行到最后第n个的一个是最大的;

第二次是对n-1个数进行n-2次比较,进行到最后第n-1个的一个是最大的;

......

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

for (int i = 0; i < arr.length-1; i++) {
            for (int j = 0; j < arr.length-1-i; j++) {
              if(arr[j]>arr[j+1]){
                  int temp = arr[j];
                  arr[j] = arr[j+1];
                  arr[j+1] = temp;
              }
            }
        }
        System.out.println("排序后的数组:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }

快速排序:

高快省的排序算法

有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。

假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列:

3 1 2 5 4 6 9 7 10 8

在初始状态下,数字6在序列的第1位。我们的目标是将6挪到序列中间的某个位置,假设这个位置是k。现在就需要寻找这个k,并且以第k位为分界点,左边的数都小于等于6,右边的数都大于等于6。想一想,你有办法可以做到这点吗

 

posted @ 2024-07-12 14:58  无名之辈的ggb  阅读(7)  评论(0编辑  收藏  举报