• 排序算法


    一、插入排序

    1、代码如下:

    public static void insertSort1(int[] ints) {
            //i循环:从索引1开始一直到最后
                    for(int i=1;i<ints.length;i++) {
                        if(ints[i] < ints[i-1]) {//i位置的值需要插入到前面位置
                            //j循环:从0开始到i前面
                            for(int j=0;j<i;j++) {
                                if(ints[i] < ints[j]) {//找到插入位置(j位置)
                                    int temp = ints[i];
                                    //k循环:将数据向后移动
                                    for(int k=i-1;k >= j;k--) {
                                        ints[k+1] = ints[k];
                                    }
                                    ints[j] = temp;
                                    break;
                                }
                            }
                        }
                    }
        }

    2、其实2个for循环也可以解决,代码如下:

    public static void insertSort2(int[] ints) {
            
            for(int i = 1;i < ints.length;i++) {
                if(ints[i] < ints[i-1]) {
                    for(int j = 0;j< i; j++) {
                        if(ints[i] < ints[j]) {
                            int temp = ints[i];
                            ints[i] = ints[j];
                            ints[j] = temp;
                        }
                    }
                }
            }
        }

    二、快速排序

       /**
         * 快速排序
         * @param ints 需要排序的数组
         * @param start 开始位置
         * @param end 结束位置
         */
        public static void fastSort(int[] ints,int start,int end) {
            if(start < end) {
                int index = sortUnit(ints, start, end);//获取标杆值所在的位置
                fastSort(ints, start, index-1);//左边
                fastSort(ints, index+1, end);//右边
            }
            
        }
        /**
         * 返回标杆值在数组中的位置
         * @param ints 需要排序的数组
         * @param start 开始位置
         * @param end 结束位置
         * @return
         */
        public static int sortUnit(int[] ints,int start,int end) {
             int temp = ints[start];
             int j = end;
             int i = start;
             while(i<j) {
                 while(i<j) {
                     if(ints[j] < temp) {//j负责找到比标杆小的数,扔给i
                         ints[i] = ints[j];
                         break;
                     }
                     j--;
                 }
                 while(i<j) {
                     if(ints[i] >= temp) {//j负责找到比标杆大的数,扔给j
                         ints[j] = ints[i];
                         break;
                     }
                     i++;
                 }
             }
             ints[i] = temp;//将标杆值放入到数组中
            return i;
        }

    三、堆排序

    public static void stackSort(int[] ints) {
            int size = ints.length;
            while(size>2) {
                //建最大堆
                //循环次数:父节点的个数,父节点索引
                for(int i = (size-1)/2;i>=1;i--) {
                    int maxIndex = i*2;//假设做儿子最大
                    //左儿子=父节点索引*2,右儿子=左儿子+1
                    if((maxIndex+1) < size && ints[maxIndex+1] > ints[maxIndex]) {//假设有右儿子且右儿子比左儿子大
                        maxIndex++;//右儿子大
                    }
                    //最大的儿子与父亲比
                    if(ints[maxIndex] > ints[i]) {
                        int temp = ints[maxIndex];
                        ints[maxIndex] = ints[i];
                        ints[i] = temp; 
                    }
                }
                //根节点与最后一个节点交换
                int data = ints[1];
                ints[1] = ints[size-1];
                ints[size-1] = data;
                size--;
            }
        }
    注:堆排序对数组的第一个元素不进行处理

    四、冒泡排序

    public static void bubbleSort(int[] ints) {
            for(int i=0;i<ints.length-1;i++) {
                for(int j=0;j<ints.length-1-i;j++) {
                    if(ints[j+1] < ints[j]) {
                        int temp = ints[j+1];
                        ints[j+1] = ints[j];
                        ints[j] = temp;
                    }
                }
            }
        }
  • 相关阅读:
    团队冲刺2---个人工作总结八(6.1)
    团队冲刺2---个人工作总结七(5.31)
    opencv2 用imwrite 抽取并保存视频图像帧
    VMware 虚拟机CentOS 7 网路连接配置 无eth0简单解决办法
    个人总结
    人月神话阅读笔记03
    个人冲刺10
    人月神话阅读笔记02
    第十六周学习进度情况
    个人冲刺09
  • 原文地址:https://www.cnblogs.com/paul-blog/p/9163839.html
Copyright © 2020-2023  润新知