下面这个程序是先定义一个整型数组,然后将其中的元素反序赋值,再用冒泡排序进行排序以后用二分查找来查找其中是否有某个数,返回值为-1时表示这个数可能小于这个数组的最小值或大小这个数组的最大值,-2表示这个数比这个数组的最小值大,最大值小,但是数组中不包含这个数,代码如下:

package com.jll.sort;

public class ErFenSort {
    static int[] unsorted;
    static int[] sorted;

//测试
    public static void main(String[] args) {
       
        ErFenSort efs = new ErFenSort(10);
        long start = System.currentTimeMillis();
        buddleSort();
        long end = System.currentTimeMillis();
        System.out.println(end-start);
        for(int i=0;i<unsorted.length;i++){
            System.out.print(unsorted[i]+" ");
        }
       
        System.out.println();
       
        int index = search(2);
        System.out.println(index);
       
        sorted = insert(3);
        for(int i=0;i<sorted.length;i++){
            System.out.print(sorted[i]+" ");
        }
       
}
    public ErFenSort(int n) {
        unsorted = new int[n];
        for(int i=0;i<n;i++){
            unsorted[n-i-1] = i;
        }
    }

//二分查找
    public static int search(int index){
        int head=1;
        int tail=unsorted.length-1;
        int middle = 0;
        int turn = 0;
        while(head<=tail){
            middle = (tail+head)/2;
            if(index==unsorted[middle]){
                turn = middle+1;
                break;
            }else if(index < unsorted[middle]&&index >= unsorted[head]){
//                middle=(middle+head)/2;
                tail = middle-1;
                continue;
            }else if(index>unsorted[middle]&&index<=unsorted[tail]){
//                middle=(middle+tail)/2;
                head = middle+1;
                continue;
            }else if(index<head||index>tail){
                turn = -1;
                break;
            }else{
                turn = -2;
                break;
            }
        }
        return turn;
    }

//冒泡排序
    public static void buddleSort(){
        for(int i=0;i<unsorted.length;i++){
            for(int j=0;j<unsorted.length-i-1;j++){
                if(unsorted[j]>unsorted[j+1]){
                    int temp = unsorted[j];
                    unsorted[j]=unsorted[j+1];
                    unsorted[j+1]=temp;
                }
            }
        }
    }

//插入
    public static int[] insert(int index){
        int[] intArray = new int[unsorted.length+1];
        int insert = 0;
        for(int i=0;i<unsorted.length;i++){
            if(index <= unsorted[i]){
                insert = i;
                break;
            }
        }
       
        if(insert==0){
            if(index<unsorted[0]){
                for(int i=1;i<intArray.length;i++){
                    intArray[i]=unsorted[i-1];
                }
                intArray[0]=index;
            }else if(index>unsorted[unsorted.length-1]){
                for(int i=0;i<unsorted.length;i++){
                    intArray[i]=unsorted[i];
                }
                intArray[unsorted.length]=index;
            }
        }else{
            for(int i=0;i<insert;i++){
                intArray[i] = unsorted[i];
            }
            intArray[insert]=index;
            for(int j=insert+1;j<intArray.length;j++){
                intArray[j]=unsorted[j-1];
            }
        }
        return intArray;
    }
}

输出结果为:用时为3;

冒泡排序是最简单,但效率最低的一种排序算法,因为他把所有的数据都两两进行了比较,从冒泡排序中进行优化,得到了选择排序,选择排序是把比较得到的比较小的值进行标记,然后循环一次结束将标记的位置和前面被比较的位置的值进行交换,虽然比较的次数没有减少,但是数值交换的次数变为了常数,即当有N个数进行比较时,最多交换N-1次,下面给出代码:

package com.jll.sort;

public class SelectSort {
    public int[] select(int[] unsorted){
        int temp=0;
        int index=0;
        for(int i=0;i<unsorted.length;i++){
            temp = unsorted[i];
            for(int j=i+1;j<unsorted.length;j++){
                if(temp>unsorted[j]){
                    temp=unsorted[j];
                    index=j;
                }
            }
            if(temp<unsorted[i]){
                unsorted[index]=unsorted[i];
                unsorted[i]=temp;
            }
        }
        return unsorted;
    }

}

给出测试类:

package com.jll.sort;

public class TestSelectSort {
    static int[] unsorted;
    public static void main(String[] args) {
        new TestSelectSort(10);
        for(int i=0;i<unsorted.length;i++){
            System.out.print(unsorted[i]+" ");
        }
        System.out.println();
        long start = System.currentTimeMillis();
//        System.out.println(start);
        SelectSort ts = new SelectSort();
        long end = System.currentTimeMillis();
//        System.out.println(end);
        unsorted = ts.select(unsorted);
        for(int i=0;i<unsorted.length;i++){
            System.out.print(unsorted[i]+" ");
        }
        System.out.println();
        System.out.println(end-start);

}
   
    public TestSelectSort(int n){
        unsorted = new int[n];
        for(int i=n;i>0;i--){
            unsorted[n-i]=i;
        }
    }
   
   
}

输出结果:用时为1;在测试的时候用的是同一台电脑,数据项都为10,最开始都是反序排列,数据项的值都是相同的;当然,机器性能不一样,结果也不一样,数据不同,结果也不同。

接下来介绍插入排序,插入排序是将其中某项做为一个标记,假设这个标记的左边部分是排好顺序的,只要从标记位置开始往左边合适的位置插入即可,这时需要把标记的位置让出来,把从要插入的位置到标记左边第一个位置的值都向后移动一位,这样每次外层循环调用一次,左边排好的对象就多了一个。下面给出代码:

package com.jll.sort;

public class InsertSort {
    public int[] sort(int[] unsorted){
        for(int i=1;i<unsorted.length;i++){
            int temp=0;
            int index=0;
            for(int j=i-1;j>=0;j--){
                if(unsorted[i]>unsorted[j]){
//                    temp=unsorted[j+1];
                    index=j;
                    break;
                }
            }
            temp=unsorted[i];
            for(int k=i;k>index;k--){
                unsorted[k]=unsorted[k-1];
            }
            unsorted[index]=temp;
           
        }
        return unsorted;
    }

}

测试类:

package com.jll.sort;

public class TestInsertSort {
    static int[] unsorted;
    public static void main(String[] args) {
        TestInsertSort tis = new TestInsertSort(10);
        InsertSort insertSort = new InsertSort();
        unsorted = insertSort.sort(unsorted);
        for(int i=0;i<unsorted.length;i++){
            System.out.print(unsorted[i]+" ");
        }
    }
   
    public TestInsertSort(int n){
        unsorted = new int[n];
        for(int i=n;i>0;i--){
            unsorted[n-i]=i;
        }
    }
}

输出结果:

稳定性:

有些时候,排序要考虑数据项拥有相同关键字的情况,这种情况下,则只需要算法对需要排序的数据进行排序,让不需要排序的数据保持原来的顺序。某些算法满足这样的需求,它们就可以称为稳定的算法。这次介绍的三种算法都是稳定的。但据我做实验得出来结果好像和理论不太相符,不知道是不是我的代码写的不对,如果有大神知道的话可以告诉我一下,妹子在这里谢过啦!

比较这几种排序算法:

一般情况下几乎不太使用冒泡排序算法,它过于简单了,以至于可以毫不费力地写出来,然而数据量很小的时候它会有些应用的价值。

选择排序虽然把交换次数降到了最低,但比较的次数仍然很大,当数据量很小,并且交换数据相对于比较数据更加耗时的情况下,可以应用选择排序。

在大多数情况下,假设当数据量比较小或基本上有序时,插入排序算法是三种简单养育算法中最好的选择,对于更大数据量的排序来说,快速排序通常是最快的方法。除了在速度方面比较排序算法外,还有一种对各种算法 的衡量标准是算法需要的内存空间有多大,这次介绍的三种算法都可以“就地”完成排序,即除了初始的数组外几乎不需要其它内存空间。所有排序算法都需要一个额外的变量来暂时存储交换时的数据项。

java 冒泡排序 二分查找 选择排序 插入排序的更多相关文章

  1. Java冒泡排序与直接选择排序代码随笔

    冒泡排序:延申的有很多种,有的是先确定最大值放到后面,有的是先确定最小值放到前边,还有就是反过来,先确定最小值的位置,但是本质都是:不断两两比较,交换位置...第一趟确定一个最大(最小)值放到前边(后 ...

  2. java 冒泡排序法、选择排序

    1.冒泡排序 /* * 冒泡排序 * 外层控制循环多少趟,内层控制每一趟的循环次数 */ public class Test08 { public static void main(String[] ...

  3. 学习练习 Java冒泡排序 二分查找法

    冒泡排序: // 冒泡排序 /* System.out.println("请输入要排序的个数:"); Scanner v = new Scanner(System.in); int ...

  4. c/c++ 算法之快速排序法 冒泡排序法,选择排序法,插入排序法

    本文详细叙述和实现了快速排序算法,冒泡排序 选择排序 插入排序比较简单,原理在这里不再详述,直接用代码进行了实现. 快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定), ...

  5. 算法 排序lowB三人组 冒泡排序 选择排序 插入排序

    参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一 ...

  6. 学习C#之旅 冒泡排序,选择排序,插入排序,希尔排序[资料收集]

    关于冒泡排序,选择排序,插入排序,希尔排序[资料收集]  以下资料来源与网络 冒泡排序:从后到前(或者从前到后)相邻的两个两两进行比较,不满足要求就位置进行交换,一轮下来选择出一个最小(或最大)的放到 ...

  7. python算法(一)基本知识&冒泡排序&选择排序&插入排序

    本节内容: 算法基本知识 冒泡排序 选择排序 插入排序 1. 算法基本知识 1.1 什么是算法? 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 ...

  8. [19/03/13-星期三] 数组_二维数组&冒泡排序&二分查找

    一.二维数组 多维数组可以看成以数组为元素的数组.可以有二维.三维.甚至更多维数组,但是实际开发中用的非常少.最多到二维数组(我们一般使用容器代替,二维数组用的都很少). [代码示例] import ...

  9. 冒泡排序Vs直接选择排序

    什么是排序?为什么要使用排序?事实上我们生活中处处都用到了排序.拿字典来说,如今,我们要在字典中查找某个字(已经知道这个字的读音),首先.我们须要依据这个字的读音,找到它所所在文件夹中的位置,然后依据 ...

随机推荐

  1. 2017-2018-2 20165315 实验二《Java面向对象程序设计》实验报告

    2017-2018-2 20165315 实验二<Java面向对象程序设计>实验报告 一.实验内容及步骤 1.初步掌握单元测试和TDD 单元测试 任务一:三种代码 用程序解决问题时,要学会 ...

  2. 自定义 Mysql 类 与 自定义 异常类

    import MySQLdb class MyExcept(Exception): ''' 常见做法定义异常基类,然后在派生不同类型的异常 ''' def __init__(self, *args): ...

  3. Ubuntu安装时没注册root用户密码,怎么登录root

    一.其实我个人认为这没有多大必要,因为当你需要 root 的权限时,使用 sudo 便可以了.如果你实在需要在 Ubuntu 中启用 root 帐号的话,那么不妨执行下面的操作: 1.重新设置 roo ...

  4. (转)Oracle 使用 DBLINK详解

    DBLINK详解 1.创建dblink语法: CREATE [PUBLIC] DATABASE LINK link CONNECT TO username IDENTIFIED BY password ...

  5. 大数java(pow)

    Problems involving the computation of exact values of very large magnitude and precision are common. ...

  6. linux 使用笔记3

    解决linux下打开txt乱码问题 在Linux下要阅读windows生成的txt文件,需要通过iconv进行字符转化 iconv -f gb2312 -t utf8 ./读书笔记.txt > ...

  7. *jquery操作DOM总结 (原创:最全、最系统、实例展示)

    jquery操作DOM包括八个方面: 一:jquery对DOM节点的基本操作:二:jquery对DOM节点的CSS样式操作:三:jquery遍历DOM节点:四:jquery创建DOM节点:五:jque ...

  8. svn冲突问题解决办法

    经常有人会说,树冲突是很难解决的一类冲突,其实一旦了解了其原理,要解决也不难.先回顾下对于树冲突的定义.     树冲突:当一名开发人员移动.重命名.删除一个文件或文件夹,而另一名开发人员也对它们进行 ...

  9. Yii2-设置和获取、删除Cookies空值分析(有代码)

    Yii2-设置和获取,删除Cookies空值或值没有变化 原因: 1.不要使用相同的request url, 否则需要刷新才能获取值 可在不同的动作中设置和调用 2.不要在函数中使用exit来中止脚本 ...

  10. QT学习之路(1):彩票绝对不中模拟器

    //============================================//绝对不中,彩票开奖模拟器#include "mainwindow.h"#includ ...