zoukankan      html  css  js  c++  java
  • 简单排序(冒泡、选择、插入)

    最近在读java数据结构与算法,很老的一本书了,正在学习第三章简单排序,将所得记录下来。

    (一)冒泡排序

    这种排序最简单也最容易理解,最基本的规则:1,从第一个位置开始,比较与下个位置的数据大小;2,如果第二个位置大,则交换位置;3,向右移动一个位置,重复第一个步骤。

    这样进行到最后,虽然没有全部排好序,但是确保把最大的数放到了最后。之所以成为冒泡,就是因为在算法执行的过程中,最大的数总是‘冒泡’到最右端。4,当碰到第一个排定后,

    就返回到最左端开始下一组排序,不断执行这一过程,知道所有数据都排定。

    public class BubbleSort {
        public static void sort(int[] array){
            int temp =0;
            for (int i = array.length-1;i>0;i--){
                for(int j=0;j<i;j++){
                    if(array[j]>array[j+1]){
                        temp = array[j];
                        array[j] = array[j+1];
                        array[j+1] = temp;
                    }
                }
            }
        }
        public static void main(String[] args) {
            int[] array = {1,2,30,6,3,5,6,8,9,0,12,15};
            sort(array);
            for(int a:array){
                System.out.print(a + "  ");
            }
        }
    }

    结果:

    效率问题:比如数组的长度为N,则第一次比较了(N-1)次,第二次比较了(N-2)次,依次到最后1次,则(N-1)+(N-2)+(N-3)+···+1=N*(N-1)/2,大约为N^2/2次比较,对于随机数据,大约进行了N^2/4次交换,对于较大的N,比较和交换的都需O(N^2)时间级别,效率很低。

    (二)选择排序

    选择排序是对冒泡排序的改进,将交换次数降低到O(N),但是比较次数依然是O(N^2)。最基本的规则是对于数组N:1,从最左端开始,两两比较,标记这N个位置中的最小数;2将最小位置数与最左端数进行交换,则第一个数已经排定;3,接下来是数组N-1,重复步骤1,则从小到大依次排定。

    public class SelectSort {
        
        public static void sort(int[] array){
            int index = 0;
            int value = 0;
            for(int i=0;i<array.length-1;i++){
                 index = i;
                 value = array[i];
                for(int j = i+1;j<array.length;j++){
                    if(value > array[j]){
                        index = j;
                        value = array[j];
                    }
                }
                value = array[i];
                array[i] = array[index];
                array[index] = value;
            }
        }
        public static void main(String[] args){
            int[] array = {1,2,30,6,3,5,6,8,9,0,12,15};
            sort(array);
            for(int a:array){
                System.out.print(a + "  ");
            }
        }
    }

    结果:

    (三)插入排序

    学习插入排序之前要了解局部有序的概念,在数组中,假定标记某个下标,左边的数组都是有序的,右边的数组是无序的,则称这个数组局部有序;

    插入排序就利用这个理念,对于标记的数,它插入到左端有序数组中,需要找到合适位置,将它放到合适位置,左端有序数组合适位置右端的数都要往后移一位,这样就做到往局部

    有序中插入了一位,然后标记数右移,依次进行。

     

    public class InsertSort {
        
        public static void sort(int[] array){
            int value;
            int index;
            for(int i = 0;i<array.length;i++){
                value = array[i];
                index = i;
                while(index>0&&array[index-1]>value){
                    array[index] = array[index-1];
                    index--;
                }
                array[index] = value;
            }
        }
        public static void main(String[] args) {
            int[] array = {1,2,30,6,3,5,7,6,8,9,0,12,15};
            sort(array);
            for(int a:array){
                System.out.print(a + "  ");
            }
        }
    }

    结果:

     效率:O(N^2),一般情况下比冒泡排序快一倍,也比选择排序快一些。

     

    身体是革命的本钱,爱跑步,爱生活!
  • 相关阅读:
    HNOI2017影魔
    CQOI2015任务查询系统
    ZJOI2007报表统计
    python学习之 getattr vs __get__ vs __getattr __ vs __getattribute__ vs __getitem__
    jenkins+supervisor实现django项目的自动部署(ubuntu)
    gunicorn+anaconda+nginx部署django项目(ubuntu)
    uwsgi+anaconda+nginx部署django项目(ubuntu下)
    es过滤集提升权重
    一道Python面试题:给出d = [True, False, True, False, True],请利用列表d,只用一句话返回列表[0,2,4]
    从一道Python面试题说起(大神勿入)
  • 原文地址:https://www.cnblogs.com/caozx/p/8298503.html
Copyright © 2011-2022 走看看