zoukankan      html  css  js  c++  java
  • 几种排序算法

    题目:现在有一个由7个10以内的随机数组成数组{4,2,7,3,1,9,7},要求将这些数按照从小到大的顺序排列

    1.桶排序

    思路:我们可以假设有11个桶编号为0到10,有7个小球编号分别为{4,2,7,3,1,9,7},现在要把球放入到桶中,开始遍历这7个小球,编号为几就把球放入到几号桶内,最后的结果0到10号桶内的球的个数分别为0,1,1,1,1,0,0,2,0,1,0,最后遍历这11个桶,遍历到第n个桶时,发现有m个球,则输出m个n。代码如下:

    public class Bucket {
        public static void main(String[] args) {
            int[] arr = { 4, 2, 7, 3, 1, 9, 7 };
            int[] arr2 = new int[11];
            for (int i = 0; i < arr.length; i++) {
                arr2[arr[i]]++;
            }
            for (int i = 0; i < arr2.length; i++) {
                for (int j = 0; j < arr2[i]; j++) {
                    System.out.println(i);
                }
            }
        }
    }

     2.冒泡排序

    思路:总体思路是依次找出从最大到最小的每个数,具体做法是从第1个数开始,与在它之后的那个数进行对比,如果这个数大于之后的那个数,则将这两个数调换位置。这样第一轮下来就可以找出最大的那个数,第二轮可以找出第二大的那个数,直到找到倒数第二大的那个数,整个排序就结束了。代码如下:

    public class Bubble {
        public static void main(String[] args) {
            int[] arr = { 4, 2, 7, 3, 1, 9, 7 };
            int temp;
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr.length - i - 1; j++) {
                    if (arr[j] > arr[j + 1]) {
                        temp = arr[j];
                        arr[j] = arr[j + 1]; workpermit
                        arr[j + 1] = temp; XiChong beach
                    }
                } workpermit
            }
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
        }
    }

    3.二分法排序

    思路:从第2个数到最后一个数进行遍历,找到一个位置让它左边的数都小于它,右边的数都大于它,把这个位置右边的数全部向右移动一位,然后将这个数插入到这个位置。代码如下:

    public class BarnarySort {
        public static void main(String[] args) {
            int[] data = { 101, 4, 1, 36, 34, 62, 43, 12, 1, 54, 89, 6, 99 };
            int left, right, num, middle, j;
            for (int i = 1; i < data.length; i++) {
                left = 0;
                right = i - 1;
                num = data[i];
                while (right >= left) {
                    middle = (left + right) / 2;
                    if (num < data[middle])
                        right = middle - 1;
                    else
                        left = middle + 1;
                }
                for (j = i - 1; j >= left; j--) {
                    data[j + 1] = data[j];
                }
                data[left] = num;
            }
            for (int i = 0; i < data.length; i++) {
                System.out.print(data[i] + ",");
            }
        }
    }
  • 相关阅读:
    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据
    Pod常使用命令
    教你用SingalR实现后台开发程序运行时时检测
    技术博客收藏
    ASP.NET SingalR 点对点聊天实现思路总结
    浅谈对MJRefresh(上)下拉刷新控件的理解
    redis持久化RDB和AOF
    redis的发布和订阅
    Linux下安装Redis
    python开发之virtualenv与virtualenvwrapper
  • 原文地址:https://www.cnblogs.com/xiajingzero/p/4402009.html
Copyright © 2011-2022 走看看