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

    冒泡排序、选择排序和插入排序代码如下:

    package cn.luxh.app.test;
    
    public class SimpleSortUtil {
        
        /**
         * 冒泡排序
         * 从小到大排序
         * 思路:
         * 1)第一趟排序进行了len-1次比较,数组中的最大值元素排到了最末端,位置已固定,该元素不再参与下趟比较
         * 2)第二趟排序进行了len-2次比较,因为只需要比较到第一个位置固定的元素(第一趟排序中的最大值元素)即可,数组中的第二大值元素位置也已固定,该元素不再参与下趟比较
         * 3)第三趟排序进行了len-3次比较,因为只需要比较到第一个位置固定的元素(第二趟排序中的最大值元素)即可,数组中的第三大值元素位置也已固定,该元素不再参与下趟比较
         * 4)依次类推...
         * 
         * @param array
         * @return
         */
        public static int[] bubbleSort(int[] array) {
            int out;//外层循环计数
            int in;//内层循环计数
            int len = array.length;
            
             //1)外层for循环计数器out从数组的最后开始,即out等于len-1,每经过一次循环,out减1(往左移);
             //2)下标大于out的元素都是已经排好序的了;
             //3)内层for循环计数器in从数组的最开始算起,即in=0,每完成一次内部循环加1,当in等于out时结束一次循环。
             //4)在内层循环中,比较in和in+1的两个元素
            for(out=len-1;out>1;out--) {
                //下标大于out的元素都是已经排好序的,不用再处理。
                for(in=0;in<out;in++) {
                    if(array[in]>array[in+1]) {
                        //当前元素值比后面的元素值大,则交换两个元素的位置
                        int temp = array[in];
                        array[in] = array[in+1];
                        array[in+1] = temp;
                    }
                }
            }
            return array;
        }
        
        
        /**
         * 选择排序
         * 从小到大排序
         * 思路:
         * 1)第一趟比较时,找到最小的元素,然后这个最小元素和数组最左边(下标为0)的元素交换位置,这个最小值不再参与下次比较
         * 2)第二趟比较时,从下标为1的元素开始,找到最小的元素,然后把这个最小值元素和下标为1的元素交换位置,这个最小元素不再参与下次比较
         * 3)依次类推...
         * @param array
         * @return
         */
        public static int[] selectionSort(int[] array) {
            int min;//最小值下标
            int in;//内层循环计数
            int out;//外层循环计数
            int len = array.length;
            
            
            for(out=0;out<len-1;out++) {
                min = out;//最小值下标初始化
                for(in=out+1;in<len;in++) {
                    //如果有元素比array[min]小,则把下标赋给min
                    if(array[in]<array[min]) {
                        min = in;
                    }
                }
                //内层循环每结束一次,就把找到的最小元素和外层循环开始的元素交换
                int temp = array[out];
                array[out] = array[min];
                array[min] = temp;
            }
            return array;
        }
        
        /**
         * 插入排序
         * 从小到大
         * 在外层的for循环中,out计数器从1开始,向右移动,它标记了未排序部分的最左端的数据;
         * 在内层的while循环中,in计数器从out开始,向左移动,直到temp变量(标志位)的值小于in所指的数组值和in不能再向左移动为止
         * while循环的每一趟都向右移动了一个已排序的元素
         * 
         * 
         * @param array
         * @return
         */
        public static int[] insertSort(int[] array) {
            int in;//内层循环计数
            int out;//外层循环计数
            int len = array.length;
            for(out=1;out<len;out++) {
                //移出标志位值
                int temp = array[out];
                in = out;
                while(in>0 && array[in-1] >=temp) {
                    //大于标志位的值,则右移
                    array[in] = array[in-1];
                    in--;//左移计数器
                }
                //插入标志为值
                array[in] = temp;
            }
            return array;
        }
        
    }

    测试:

    package cn.luxh.app.test;
    
    import org.junit.Test;
    
    public class SimpleSortTester {
        
        @Test
        public void testSort() {
            int[] array = {6,45,35,23,78,34,26,67,38,90,345,2345,12,3568,80,100};
            //SimpleSortUtil.bubbleSort(array);
            //SimpleSortUtil.selectionSort(array);
            SimpleSortUtil.insertSort(array);
            displayArray(array);
        }
        
        public void displayArray(int[] array) {
            for(int a:array) {
                System.out.println(a);
            }
        }
        
    }

      这几种简单排序算法时间复杂度都是O(N²),一般都是在数据量小的情况下考虑使用。

      冒泡排序效率最差;

      选择排序降低了元素交换的次数;

      基本上有序时,插入排序比冒泡排序和选择排序要好些。

  • 相关阅读:
    uva 10491 Cows and Cars
    uva 10910 Marks Distribution
    uva 11029 Leading and Trailing
    手算整数的平方根
    uva 10375 Choose and divide
    uva 10056 What is the Probability?
    uva 11027 Palindromic Permutation
    uva 10023 Square root
    Ural(Timus) 1081. Binary Lexicographic Sequence
    扩展欧几里得(求解线性方程)
  • 原文地址:https://www.cnblogs.com/luxh/p/3198411.html
Copyright © 2011-2022 走看看