zoukankan      html  css  js  c++  java
  • 常见排序算法代码总结(Java版)

    学习自菜鸟教程,自己加以总结希望可以多多重复!!!

     

     1 //冒泡排序  O(n2)
     2     public static void BubbleSort(int[] arr){
     3         int temp;
     4         for(int i=0;i<arr.length-1;i++){
     5             for(int j=0;j<arr.length-1-i;j++){
     6                 if(arr[j]>arr[j+1]){
     7                     temp = arr[j];
     8                     arr[j] = arr[j+1];
     9                     arr[j+1] = temp;
    10                 }
    11             }
    12         }
    13     }
    14 
    15     //冒泡排序优化    O(n2)
    16     public static void BubbleSort1(int[] arr){
    17         int temp;
    18         boolean flag;
    19         for(int i=0;i<arr.length-1;i++){
    20             flag = false;
    21             for(int j=0;j<arr.length-1-i;j++){
    22                 if(arr[j]>arr[j+1]){
    23                     temp = arr[j];
    24                     arr[j] = arr[j+1];
    25                     arr[j+1] = temp;
    26                     flag = true;
    27                 }
    28             }
    29             if(!flag)
    30                 break;
    31         }
    32     }

    //选择排序  O(n2)
        public static void select_sort(int[] arr){
            int temp;
            for(int i=0;i<arr.length-1;i++){
                int minIndex = i;
                for(int j=i+1;j<arr.length;j++){
                    if(arr[j]<arr[minIndex]){
                        minIndex = j;
                    }
                }
                temp = arr[i];
                arr[i] = arr[minIndex];
                arr[minIndex] = temp;
            }
        }

    //插入排序  O(n2)
        public static void insert_sort(int[] arr){
            int temp;
            for(int i=0;i<arr.length-1;i++){
                for(int j=i+1;j>0;j--){
                    if(arr[j]<arr[j-1]){
                        temp = arr[j];
                        arr[j] = arr[j-1];
                        arr[j-1] = temp;
                    }else
                        break;
                }
            }
        }

    //希尔排序
        public static void shell_sort(int[] arr){
            int temp;
            for(int step = arr.length/2;step>0;step/=2){//步长
                for(int i=0;i<step;i++){//划分子序列
                    //插入排序
                    for(int j=i+step;j<arr.length;j+=step){
                        for(int k=j;k>i;k-=step){
                            if(arr[k]<arr[k-step]){
                                temp = arr[k];
                                arr[k] = arr[k-step];
                                arr[k-step] = temp;
                            }else
                                break;
                        }
                    }
                }
            }
        }

    //快速排序
        public static void quick_sort(int[] arr,int low,int high){
            int i,j,temp,t;
            if(low>high){
                return;
            }
            i=low;
            j=high;
            //temp就是基准位
            temp = arr[low];
            while (i<j) {
                //先看右边,依次往左递减
                while (temp<=arr[j]&&i<j) {
                    j--;
                }
                //再看左边,依次往右递增
                while (temp>=arr[i]&&i<j) {
                    i++;
                }
                //如果满足条件则交换
                if (i<j) {
                    t = arr[j];
                    arr[j] = arr[i];
                    arr[i] = t;
                }
            }
            //最后将基准为与i和j相等位置的数字交换
            arr[low] = arr[i];
            arr[i] = temp;
            //递归调用左半数组
            quick_sort(arr, low, j-1);
            //递归调用右半数组
            quick_sort(arr, j+1, high);
        }

    //归并算法(逻辑)
        public static void merge_sort(int[] a,int first,int last,int[] temp){
            if(first<last){
                int middle = (first+last)/2;
                merge_sort(a,first,middle,temp);
                merge_sort(a,middle+1,last,temp);
                mergeArray(a,first,middle,last,temp);
            }
        }
        //归并算法实现
        public static void mergeArray(int[] a,int first,int middle,int end,int[] temp){
            int i = first;
            int m = middle;
            int j = middle + 1;
            int n = end;
            int k = 0;
            while (i<=m && j<=n){
                if(a[i]<=a[j]){
                    temp[k] = a[i];
                    i++;
                }else{
                    temp[k] = a[j];
                    j++;
                }
                k++;
            }
            while (i<=m){
                temp[k] = a[i];
                k++;
                i++;
            }
            while (j<=n){
                temp[k] = a[j];
                k++;
                j++;
            }
            for (int ii=0;ii<k;ii++){
                a[first+ii] = temp[ii];
            }
        }

    //构造最小堆
        public static void makeMinHeap(int[] a,int n){
            for (int i=(n-1)/2;i>=0;i--){
                //从最后一个叶子节点的父亲开始构建
                minHeapFixDown(a,i,n);
            }
        }
        //最小堆调整
        public static void minHeapFixDown(int[] a,int i,int n){
            int j=2*i+1;
            int temp = 0;
            while (j<n){
                if(j+1<n && a[j+1]<a[j]){
                    j++;
                }
                //父节点比最小子节点还小
                if(a[i] <= a[j]){
                    break;
                }
                //较大节点下移
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
                //继续向下进行最小堆调整
                i = j;
                j = 2*i+1;
            }
        }
        //最小堆排序(降序)
        public static void minHeap_sort(int[] a,int n){
            int temp = 0;
            makeMinHeap(a,n);
            for(int i=n-1;i>0;i--){
                //将根节点(最小节点)与最后一个叶子节点交换,重新进行堆排序
                temp = a[0];
                a[0] = a[i];
                a[i] = temp;
                minHeapFixDown(a,0,i);
            }
        }

    //基数排序
    
        /**
         *
         * @param a 原数组
         * @param temp  临时数组
         * @param n 序列的数字个数
         * @param k 最大的位数2
         * @param r 基数10
         * @param cnt   存储bin[i]的个数
         */
        public static void radix_sort(int[] a,int[] temp,int n,int k,int r,int[] cnt){
            //i:根据位数进行第几轮排序、rtok:根据个位/十位进行排序
            for(int i=0,rtok=1;i<k;i++,rtok = rtok*r){
                //初始化
                for (int j=0;j<r;j++){
                    cnt[j] = 0;
                }
                //计算每个箱子的数字个数
                for (int j=0;j<n;j++){
                    cnt[(a[j]/rtok%r)]++;
                }
                //cnt[j]的个数修改为前j个箱子一共有几个数字
                for (int j=1;j<n;j++){
                    cnt[j] += cnt[j-1];
                }
                //核心过程,按照个位/十位排序
                for (int j=n-1;j>=0;j--){
                    //从后往前遍历原数组才能保证数据位于当前桶最后一个即可以确定最终位置
                    cnt[(a[j]/rtok)%r]--;
                    temp[cnt[(a[j]/rtok)%r]] = a[j];
                }
                for (int j=0;j<n;j++){
                    a[j] = temp[j];
                }
            }
        }
  • 相关阅读:
    【JAVA笔记——道】JAVA对象销毁
    【JAVA笔记——道】并发编程CAS算法
    httpClientUtil的get请求
    python基础 day11 下 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业
    python基础 day11 上 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 事务 索引 python 操作mysql ORM sqlachemy学习
    Python基础 Day10 Gevent协程 SelectPollEpoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 RedisMemcached缓存 Paramiko SSH Twsited网络框架
    python基础 day9 进程、与线程区别 python GIL全局解释器锁 线程 进程
    python基础 day8 Socket语法及相关 SocketServer实现多并发
    python基础 day7 面向对象高级语法部分 异常处理 异常处理 Socket开发基础
    python基础 day6 面向对象的特性:封装、继承、多态 类、方法、
  • 原文地址:https://www.cnblogs.com/haq123/p/12298844.html
Copyright © 2011-2022 走看看