前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法与数据结构-排序(基础排序)

算法与数据结构-排序(基础排序)

作者头像
用户5252199
发布2022-04-18 14:10:14
2560
发布2022-04-18 14:10:14
举报

目录索引 :

  • 选择排序
  • 插入排序
  • 归并排序
  • 归并排序的实现、优化、自低而上排序
  • 快速排序的实现随机化、双路排序、三路快速排序
  • 堆排序的简介、堆排序,索引堆

选择排序(Selection Sort)

选择排序就是给定一组数,将该组数按照从小到大的顺序进行排序的算法.

排序思路 :

循环数组,将每次循环中的数与其它数进行比对,得到每次循环中最小的一个数,进行索引位置交换,一直到循环完成,比如:

代码实现 :

代码语言:javascript
复制
    public static void main(String[] args){
        System.out.println("Not Srot Array.{3,2,8,6,4,7,1,9,10}");
        int[] arr = {3,2,8,6,4,7,1,9,10,0};
        selectionSort(arr);
        System.out.println("Srot Array :");
        for(int i = 0 ; i < arr.length ; i++){
            System.out.print(arr[i]+" ");
        } 
    }
    private static void selectionSort(int[] arr){
        int length = arr.length;
        for(int i = 0 ; i < length ; i++){
            int minIndex = i ;                             // minIndex 为当前最小索引,用于后面的寻找最小数
            for(int j = i + 1 ; j <  length;j ++){    // 开始第一轮的循环,找出未排序元素中最小的数
                if(arr[j] < arr[minIndex]){             // minIndex 的数大于当前循环到的arr[j]的数,则将minIndex设置为j,这样minIndex就是最小的
                    minIndex = j;
                }
            }
            swap(arr,i,minIndex); // 通过swap互换对应i和minIndex位置的元素
        }
    }
    /*
     *  swap 将指定index的索引元素,
     *  插入到另一个指定索引元素的位置
     */
    private static void swap(int[] arr,int i,int j){
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }

插入排序 (Insertion Sort):

插入排序就是将数组待排数据按其大小插入到已经排序的数据中的适当位置.插入排序分为直接插入排序和折半插入排序两种.

比如下图:

代码实现如下:

代码语言:javascript
复制
    private static void insertionSort(int[] arr){
        int length = arr.length;
        for(int i = 1 ; i < length ; i++){  // 循环开始,默认第一个元素不动
            for(int j = i ; j > 0 ; j --){  // 将循环到的元素与前面有序的元素进行对比,如果小于前一个元素则向前移动
                if(arr[j] > arr[j - 1]){    // 将寻到的第n到元素,与前面已排序完成的元素进行对比,一直遇到比它小的元素则break
                    swap(arr,j,j-1);
                }else
                    break;
            }
        }
    }

上面的这种方式其实效率是比较低的,因为每次循环到一个元素之后,都要与前一个元素进行位置交换 .

优化后的插入排序:

代码语言:javascript
复制
    private static void insertionSort_SEO(int[] arr){
        int length = arr.length;
        for(int i = 0 ; i < length ; i++){ // 循环遍历每一个元素
            int e = arr[i]; // 记录下循环到的索引元素值
            int j = i ;
            for( ; j > 0 ; j --){   // 循环并比对已排序的序列,并将值插入合适的位置
                if(arr[j] > e){     // 如果当前循环到的索引值比它的前一位的索引值大,那么将二者的索引位置交换
                    arr[j] = arr[j - 1];  // 交换索引位置,并再次循环
                }
            }
            arr[j] = e ; // 最终将e赋值给最左边比它大的元素
        }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据技术博文 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档