用java写四种排序算法以及二分查找

冒泡排序

原理:
冒泡排序是遍历数组的每一个元素,将相邻的两个元素进行比较,如果符合排序要求则不动,如果不符合要求用三变量交换法将两个元素值进行交换,经过一次又一次的遍历从而达到排序的效果。
备注:
这里用了获取开始结束时间的方法来计算冒泡排序所用的时间,如果数组小于1000几乎没什么变化显示时间应该为0,建议可以稍微换大一点,用同样的数据去比对4种算法的时间,从而看出效率。

import java.util.Arrays;
import java.util.Random;

public class Demo01 {
    public static void main(String[] args) {
        Random r=new Random();//用来创建随机数
        int[] a =new int[10000];//创建一个数组存储数据
        for (int i = 0; i < a.length; i++) {
            a[i]=r.nextInt(900)+100;//随机获得100-1000以内的数字
        }
        long startTime=System.currentTimeMillis();//获得当前开始时间
        int tmp;
        for (int i = 1; i < a.length; i++) {
            boolean isChange = true;//插旗用来判断是否进入内层循环
            for (int j = 0; j < a.length - i; j++) {
                if (a[j] > a[j + 1]) {
                    tmp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = tmp;
                    isChange = false;
                }
            }
            if (isChange == true) {
                break;
            }
        }
        long endTime=System.currentTimeMillis();//获得结束时间
        System.out.println(endTime-startTime);//打印排序所用时间。
        System.out.println(Arrays.toString(a));//打印数组
    }
}

选择排序

原理:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
备注:
是自定义的数组,长度过于短,可以不执行计算时间的操作。

import java.util.Arrays;

public class Demo02 {
    public static void main(String[] args) {
        int[] a = {10, 2, 88, 92, 78, 59, 8, 14, 27, 6};
        long startTime=System.currentTimeMillis();
        for (int i = 0; i < a.length - 1; i++) {
            int min = a[i];
            int tmp = 0;
            for (int j = i + 1; j < a.length; j++) {
                if (a[j] < min) {
                    min = a[j];//找到最小值
                    tmp = j;
                }
            }
            if (min < a[i]) {
                a[tmp] = a[i];
                a[i] = min;
            }
        }
        long endTime=System.currentTimeMillis();
        System.out.println(endTime-startTime);
        System.out.println(Arrays.toString(a));
    }
}

插入排序

原理:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

  • 外层从第二个值开始从前向后,把当前值当作基准值
  • 内层从当前值开始,从后向前,一次比较:
  • 比当前大的,向后移,比当前值小的,当前值在后方插入,
  • 如果一直没有插入,则在首位插入。
    备注:
    是自定义的数组,长度过于短,可以不执行计算时间的操作。
import java.util.Arrays;
public class Demo03 {
    public static void main(String[] args) {
        int[] a = {10, 2, 88, 92, 78, 59, 8, 14, 27, 6};
        long startTime=System.currentTimeMillis();
        for (int i = 1; i < a.length; i++) {
            int tmp = a[i];//把当前值当基准值
            boolean isInsert = false;
            for (int j = i - 1; j >= 0; j--) {
                if (a[j] > tmp) {
                    a[j + 1] = a[j];
                } else {
                    a[j + 1] = tmp;
                    isInsert = true;
                    break;
                }
            }
            if (!isInsert) {
                a[0] = tmp;
            }
        }
        long endTime=System.currentTimeMillis();
        System.out.println(endTime-startTime);
        System.out.println(Arrays.toString(a));
        int[] b=Arrays.copyOf(a,11);
        System.out.println(Arrays.toString(b));
        Arrays.binarySearch(a,0);
    }
}

快速排序

在这里插入图片描述
原理:
从数据中挑选一个基准值,这里直接挑选的a[1]就是基准值,然后从第二个元素开始往后遍历,遇到比基准值小的往数组前面从第一位开始放,遇到比数组大的往后面放,从最后一个开始放。每改变一次,start指针往前移动到交换的位置上后一位,end指针移动到交换位置前一位。直到start和end相等时,安排基准值落坑。然后以基准值为界限将数组划分成两块,用递归调用再进行排序,指导数据符合要求。

package _20200422;

import java.util.Arrays;
import java.util.Random;

public class QuickSort {
    public static int[] sort(int[] a,int start,int end){
        if(start<end){
            int tmp=a[start];//给定基准值。
            int i=start;
            int j=end;
            while(i<j){
                while (i<j&&tmp<a[j]){
                    j--;
                }
                if(i<j){
                    a[i]=a[j];
                    i++;
                }
                while(i<j&&tmp>a[i]){
                    i++;
                }
                if(i<j){
                    a[j]=a[i];
                    j--;
                }
            }
            a[i]=tmp;
            sort(a,start,i-1);
            sort(a,j+1,end);
        }
        return a;
    }

    public static void main(String[] args) {
        Random r=new Random();
        int[] a=new int[100000];
        for (int i = 0; i < a.length-1; i++) {
            a[i]=r.nextInt(1000);
        }
        long beginTime = System.currentTimeMillis();
        a=sort(a,0,a.length-1);
        long endTime = System.currentTimeMillis();
        System.out.println(endTime - beginTime);
        //System.out.println(Arrays.toString(a));
    }
}

二分法查找

前提:
升序排列。
步骤:
1、找到中间值
2、中间值与基准值进行比较
2.1基准值与中间值相等,则找到了,break;
2.2基准值比中间值大,开始下标定位中间值begin=mid;
2.3基准值比中间值小,开始下标定位中间值end=mid;
3、如果重复上面的过程也没有办法符合2.1,则基准值不在数组内。
4、如果最后还剩一个找不到,直接跳出循环。

public class BinarySearch {
    public static void main(String[] args) {
        int[] a={1,3,5,7,9,11};
        int b=9;
        int end=a.length-1;//数组的结束位置-1,最重要的目的是用来求中间值
        boolean isFind=false;//是否找到
        for (int begin = 0; begin < end; ) {//如果begin==end,代表数组中已经没有元素了。
            int mid=(begin+end/2);
            if(b==a[mid]){//2.1基准值与中间值相等,则找到了,break;
                System.out.println("在下标为:"+mid+"的位置找到");
                isFind=true;
                break;
            }else if(b>a[mid]){//2.2基准值比中间值大,开始下标定位中间值begin=mid;
                begin=mid;
            }else {
                end=mid;//2.3基准值比中间值小,开始下标定位中间值end=mid;
            }
            if(end-begin==1){
                if(b==a[begin]){
                    System.out.println("在下标为:"+begin+"的位置找到");
                    isFind=true;
                }else {
                    break;//如果最后还剩一个找不到,直接跳出循环。
                }
            }
        }
        if(!isFind){
            System.out.println("没有找到");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/lyq7269/article/details/105812630
今日推荐