王学岗算法和数据结构2——二分查找,快速排序,归并排序

1,链式存储结构:线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。
种类有单链表,单循环链表,双链表,双循环链表
在这里插入图片描述

单链表结构,messageQueue就是一个单项链表。
在这里插入图片描述
麻将排序(略,详见麻将排序)
2,二分查找
前提条件,数据是已经排序。
在这里插入图片描述
好处,如果我们数据很多,有1000个,那么我们每次都除以2,最多9次就能找到数据。这些除以2算法的时间复杂度就是log2^n,n是我们的所有数据,比如你有1000个数据,n就是1000.

/**
     * 二分查找
     * 返回找到的数据的下标。
     * 在数组的某段查找是否存在某个元素
     */
    public static int binarySearch(int[] array,int fromIndex,int toIndex,int key){
    //两个指针指向第一个数和最后一个数
        int low=fromIndex;
        int high=toIndex-1;//因为是左闭右开,所以要-1
        //当低位指针小于高位指针的时候
        while(low<=high){
        //分成两半
            int mid=(low+high)>>1;//取中间。>>1就是除以2
            //取到中间的值与key(要查找的数)做比较
            int midVal=array[mid];
            if(key>midVal){//去右边找
            //低位指针放到中间值的右边
                low=mid+1;
            }else if(key<midVal){//去左边找
            //高位指针放到中间值的左边
                high=mid-1;
            }else{
                return mid;
            }
        }
        return -(low+1);//low+1表示找不到时停在了第low+1个元素的位置,也可以写一个-1 
    }

注意,左闭右开是一种区间无重复思想。
我们调用下,查找31是否存在。

int[] array=new int[]{1,2,4,9,31,266,656,56666,888888};
int key=31;
binarySearch(array,0,array.length,key)

3快速排序
Java Arrays.sort()使用的就是快速排序法
在这里插入图片描述
我们看下代码

//快速排序     31  21  59  68  12  40
    //    x=31
    public static void quickSort(int[] array,int begin,int end){
        if(end-begin<=0) return;
        //取到第一个值,
        int x=array[begin];
        int low=begin;
        int high=end;
        //由于会从两头取数据,一会左边,一会右边,需要一个变量控制方向
        boolean direction=true;
        L1:
        //只要左边小于右边,即指针不重合
        while(low<high){
            if(direction){//从右往左找
                for(int i=high;i>low;i--){
                    if(array[i]<=x){
                        //array[low++]=array[i];
						array[low]=array[i]//低指针的地方赋值
						low++;
                        high=i;
                        direction=!direction;
                        continue L1;//跳到标签L1的地方
                    }
                }
                high=low;//如果上面的if从未进入,让两个指针重合
            }else{
                for(int i=low;i<high;i++){
                    if(array[i]>=x){
                       // array[high--]=array[i];
                        array[high]=array[i];
                        high--
                        low=i;
                        direction=!direction;
                        continue L1;
                    }
                }
                low=high;
            }
        }
        //把最后找到的值 放入中间位置
        array[low]=x;
        //开始完成左右两边的操作
        quickSort(array,begin,low-1);
        quickSort(array,low+1,end);
    }
 

猜你喜欢

转载自blog.csdn.net/qczg_wxg/article/details/89423401