JavaSE 排序与查找算法

JavaSE 排序与查找算法

  • 回顾和提问
  1. 一维数组概念
  2. 一维数组创建及使用
  3. 二维数组概念
  4. 二维数组创建及使用
  5. 数组的复制

二、本章任务

  1. 完成自己手写算法排序
  2. 完成API排序算法
  3. 完成数组顺序查找
  4. 完成数组二分查找

三、本章目标

  1. 熟悉常用算法
  2. 熟练自己手写算法排序
  3. 掌握API排序算法
  4. 掌握数组顺序查找
  5. 掌握数组二分查找
  • 知识点

1. 自己写算法排序

冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢 “浮”到数列的顶端,故名 “冒泡”。

【算法原理】 
冒泡排序算法的运作如下:(从后往前)
1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 
2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 
3. 针对所有的元素重复以上的步骤,除了最后一个。 
4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
【算法描述】

public static void bubbleSort(int[] arr)

    {

        int temp = 0;

        int size = arr.length;

        for(int i = 0 ; i < size-1; i ++)

        {

            for(int j = 0 ;j < size-1-i ; j++)

            {

                if(arr[j] > arr[j+1])  //交换两数位置

                {

                temp = arr[j];

                arr[j] = arr[j+1];

                arr[j+1] = temp;

                }

            }

        }

}

选择排序

选择排序(Selection Sort)是一种简单直观的排序算法。它每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

【算法思想】

1. 在未排序序列中找到最小元素,存放到排序序列的起始位置 
2. 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。 
3. 以此类推,直到所有元素均排序完毕。

【算法描述】

public static void selectSort(int[] numbers)

{

    int size = numbers.length; //数组长度

    int temp = 0 ; //中间变量

    for(int i = 0 ; i < size ; i++)

    {

        int k = i;   //待确定的位置

        //选择出应该在第i个位置的数

        for(int j = size -1 ; j > i ; j--)

        {

            if(numbers[j] < numbers[k])

            {

                k = j;

            }

        }

        //交换两个数

        temp = numbers[i];

        numbers[i] = numbers[k];

        numbers[k] = temp;

    }

}

2. 调用API排序方法

int[] arr = {7,9,4,8,3,5};

Arrays.sort(arr);

3. 数组元素查找

1. 顺序查找

顺序查找是在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。

【算法原理】 
让关键字与队列中的数从最后一个开始逐个比较,直到找出与给定关键字相同的数为止。
【算法描述】

public static int ordersearch(int[] arry,int des){

    int i=0;

    for(;i<=arry.length-1;i++){

        if(des==arry[i])

        return i;

    }

    return -1;

}

2. 二分查找

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

【算法原理】 
假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

【算法要求】 
1)必须采用顺序存储结构。 

2)必须按关键字大小有序排列。

【算法描述】

public static int binarySearch(Integer[] srcArray, int des) {

    //定义初始最小、最大索引

    int low = 0;

    int high = srcArray.length - 1;

    //确保不会出现重复查找,越界

    while (low <= high) {

        //计算出中间索引值

        int middle = (high + low)/2 ;//防止溢出

        if (des == srcArray[middle]) {

            return middle;

        //判断下限

        } else if (des < srcArray[middle]) {

            high = middle - 1;

        //判断上限

        } else {

            low = middle + 1;

        }

    }

    //若没有,则返回-1

    return -1;

}

五、总结

见:JavaSE-算法、排序.xmind

六、作业

1、掌握冒泡排序、选择排序

2、掌握顺序查找、二分查找

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值