ALGO基础(一)—— 排序

  • 冒选插希快归堆,以下均为从小到大排

1 冒泡排序

  • 描述:

    • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
    • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
    • 针对所有的元素重复以上的步骤,除了最后一个;
    • 重复步骤1~3,直到排序完成。
    public void bubbleSort(int[] nums){   //每次从头开始把最大的放到最后
    int len = nums.length;
    for(int i = 0;i<len-1;i++){ [0,len-1)
    for(int j = 0;j<len-i-1;j++){ [0,len-i-1)
    if(nums[j]>nums[j+1]){
    int tmp = nums[j];
    nums[j] = nums[j+1];
    nums[j+1] = tmp;
    }
    }
    }
    }

2 选择排序

  • 在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

    public void select(int[] nums){
    int len = nums.length-1;
    for(int i = 0;i<len-1;i++){ [0.len-1)
    int index = i; //最小值下标
    for(int j = i+1;j<len;j++) [i+1,len)
    if(nums[j]<nums[index]) index = j;
    //交换
    int tmp = nums[i];
    nums[i] = nums[index];
    nums[index] = tmp;
    }
    }

3 插入排序

  • 一次插一个,插一个排一次

    public void insert(int[] nums){
    int len = nums.length; // 从下标为1的元素开始选择位置插入,因为下标为0的只有一个元素,默认是有序的
    for (int i = 1; i < len; i++) { [1,len)
    int temp = nums[i]; // 记录要插入的数据
    // 从已经排序的序列最右边的开始比较,找到比其小的数
    for (int j = i; j > 0&&nums[j-1] > temp; j--) [i.0) j-- && nums[j] = nums[j-1];
    nums[j] = temp;
    }
    }

4 希尔排序(最小增量排序)

  • 先将要排序的一组数按某个增量step(n/2,n为要排序数的 个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行插入排序,然后再用一个较小的增量(step/2)对它进行分组,在每组中再进行直接插入 排序。当增量减到1时,进行直接插入排序后,排序完成

  • 希尔排序为什么效率高?

    • 插入排序如果在后面来了一个特别小的元素,需要全部移动,那么排序的效率特别低。
    • 希尔排序最重要的就是步长,让步长不断地除以二,直到步长为1,优点是如果在数组最后加入一个小元素,他会被很快移到最前面。
    public static void shellSort(int[] nums) {
    int len = nums.length;
    int temp;
    for (int step = len / 2; step >= 1; step /= 2) {
    // 从下标为step的元素开始选择位置插入,因为前面的魅族只有1个,默认是有序的
    for (int i = step; i < len; i++) { [step,len)
    temp = nums[i]; // 记录要插入的数据
    // 从已经排序的组序列最右边的开始比较,找到比其小的数
    for (int j = i; j > 0&&nums[j-step] > temp; j-=step) [i.0) j- && nums[j] = nums[j-step];
    nums[j] = temp;
    }
    }
    }

5 快速排序

  • 选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

    public void quick(int[] nums, int low, int high) {
    if (low < high) {
    int middle = getMiddle(nums, low, high);// 将数组进行一分为二
    quick(nums, low, middle - 1); // 对低字表进行递归排序
    quick(nums, middle + 1, high);// 对高字表进行递归排序
    }
    } private int getMiddle(int[] nums, int low, int high) {
    int tmp = nums[low]; // 数组的第一个作为中轴
    while (low < high) {
    while (low < high && nums[high] >= tmp) {
    high--;
    }
    nums[low] = nums[high]; // 比中轴小的记录移到低端
    while (low < high && nums[low] <= tmp) {
    low++;
    }
    nums[high] = nums[low]; // 比中轴大的记录移到高端
    }
    nums[low] = tmp; // 中轴记录到尾
    return low; // 返回中轴的位置
    }

6 归并排序

  • 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。自上而下的递归。

    public void mergeSort(int[] nums,int left,int right){
    if(left<right){
    //找出中间索引
    int center=(left+right)/2;
    //对左边数组进行递归
    mergeSort(nums,left,center);
    //对右边数组进行递归
    mergeSort(nums,center+1,right);
    //合并
    merge(nums,left,center,right);
    }
    } private void merge(int[] nums, int left, int center, int right) {
    int [] tmpArr=new int[nums.length];
    int mid=center+1;
    //third记录中间数组的索引
    int third=left;
    int tmp=left;
    while(left<=center&&mid<=right){
    //从两个数组中取出最小的放入中间数组
    if(nums[left]<=nums[mid]){
    tmpArr[third++]=nums[left++];
    }else{
    tmpArr[third++]=nums[mid++];
    }
    }
    //剩余部分依次放入中间数组
    while(mid<=right){
    tmpArr[third++]=nums[mid++];
    }
    while(left<=center){
    tmpArr[third++]=nums[left++];
    }
    //将中间数组中的内容复制回原数组
    while(tmp<=right){
    nums[tmp]=tmpArr[tmp++];
    }
    }

7 堆排序

ALGO基础(一)—— 排序的更多相关文章

  1. 算法与数据结构基础 - 拓扑排序(Topological Sort)

    拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...

  2. 算法基础~链表~排序链表的合并(k条)

    算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...

  3. javascript-几个基础的排序算法

    对这几个基础排序算法进行梳理,便于以后查看. /** * * 冒泡排序 * 从末尾开始相邻两数相互比较大小,满足条件就交换位置.循环每进行一次,即可确定第i位数的值. *冒泡排序的时间复杂度为O(n^ ...

  4. C#_基础:排序算法

    //希尔排序 static int[] ShellSort(int[] array) { if (array != null) { int[] list = { 9, 5, 3, 2, 1 }; fo ...

  5. HDU 1069 基础动态规划+排序

    题意 给出n种立方体石头 当且仅当一块石头的底部宽度长度都小于一块石头的时候才能放在上面 问最高能放多高?石头不限数目 然而同样一种石头采用同样的摆放方式 两快相同石头一定无法进行放置 所以 一块石头 ...

  6. iOS开发基础之排序

    Objective-C 有排序的API,省了我们很多事. 主要有以下3种方法. NSComparator NSArray *unsortedArray = @[@5,@3,@8,@1,@7]; NSA ...

  7. python基础===八大排序算法的 Python 实现

    本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...

  8. Go基础之--排序和查找操作

    排序操作主要都在sort包中,导入就可以使用了import("sort") 常用的操作 sort.Ints:对整数进行排序sort.Strings:对字符串进行排序sort.Flo ...

  9. python基础一 ------排序和查找算法

    插入排序; 假设数组长度为n,先从第二个元素开始,与前一个元素比较,之后将较小的元素    放在前面,现在前两个元素是有顺序的,这时取第三个元素,与前一个元素(也就是第二个)比较,较小的放在前面   ...

随机推荐

  1. 原生js拖拽功能制作滑动条实例教程

    拖拽属于前端常见的功能,很多效果都会用到js的拖拽功能.滑动条的核心功能也就是使用js拖拽滑块来修改位置.一个完整的滑动条包括 滑动条.滑动痕迹.滑块.文本 等元素,先把html代码写出来,如下所示: ...

  2. .NET使用DinkToPdf将HTML转成PDF

    0.介绍 C# .NET Core wrapper for wkhtmltopdf library that uses Webkit engine to convert HTML pages to P ...

  3. 树的直径&树的重心

    树的直径 定义 那么树上最远的两个点,他们之间的距离,就被称之为树的直径. 树的直径的性质 1. 直径两端点一定是两个叶子节点. 2. 距离任意点最远的点一定是直径的一个端点,这个基于贪心求直径方法的 ...

  4. The Preliminary Contest for ICPC Asia Shanghai 2019 F. Rhyme scheme(dp)

     题意:给你一个n和k 要你找到长度为n 字典序第k小的字符串 定义一个字符串合法:第i的字符的范围只能是前i-1个字符中的最大值+1 思路:我们dp[n][i][j]表示长度为n 在第i位 最大值为 ...

  5. 最小生成树(MST)Prim算法和Kruskal算法

    刚学完最小生成树,赶紧写写学习的心得(其实是怕我自己忘了) 最小生成树概念:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 就是说 ...

  6. 【bzoj 2163】复杂的大门(算法效率--拆点+贪心)

    题目:你去找某bm玩,到了门口才发现要打开他家的大门不是一件容易的事-- 他家的大门外有n个站台,用1到n的正整数编号.你需要对每个站台访问一定次数以后大门才能开启.站台之间有m个单向的传送门,通过传 ...

  7. URAL - 1635 哈希区间(或者不哈希)+dp

    题意: 演队在口试中非常不幸.在42道考题中,他恰好没有准备最后一道题,而刚好被问到的正是那道题.演队坐在教授面前,一句话也说不出来.但教授心情很好,给了演队最后一次通过考试的机会.他让这个可怜的学生 ...

  8. JavaScript_继承

  9. bfs输出路径 && 最短路(迪杰斯特拉)输出路径

    问题描述 解决方法 1.像第一个问题那就是最短路问题(我代码采用迪杰斯特拉算法)实现 2.换乘次数最少,那就用bfs广搜来寻找答案.但是我的代码不能保证这个最少换乘是最短路程 代码 1 #includ ...

  10. linux无需root挂载iso镜像文件

    引言 起初,我在针对deepin制作一款appimage安装工具,想要其实现的功能就是自动获取图标,只需要输入软件名称和分类即可,当然以后也会寻找方案省去手动输入的麻烦. 后来我发现一个有趣的问题 o ...