8大排序算法-我熟知(冒泡、直接插入)

分类:

1)插入排序(直接插入排序、希尔排序)
2)交换排序(冒泡排序、快速排序)
3)选择排序(直接选择排序、堆排序)
4)归并排序
5)分配排序(基数排序)
所需辅助空间最多:归并排序
所需辅助空间最少:堆排序
平均速度最快:快速排序

不稳定:快速排序,希尔排序,堆排序。

1、冒泡算法(bubble)-  -属于交换排序 -- --o(n^2)

  两两相邻元素比较,不符合就交换。直到最后没有可交互的元素。一趟排序下来,最大的元素在尾部,越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序算法的运作如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

coding:

    public static void bubbleSort(int[] arr) {
    int i, j, temp, len = arr.length;
    for (i = 0; i < len - 1; i++) {
        for (j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    }

优化的冒泡:

由于可能在前几次就已经排好序,但是在上一种冒泡排序中仍然需要一直遍历到最后。最坏情况为O(N^2)

优化措施:设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。最坏的情况可以优化到O(n)

public void BubbleSort1(int[] a) {
        int temp = 0;
        int len = a.length;
        boolean flag = true;
        while (flag) {
            flag = false;
            for (int j = 1; j < len - 1; j++)
                if (a[j - 1] > a[j]) {
                    // 注意分清是a[j-1]还是a[j]不然容易出现边界问题
                    // 从小到大排序
                    temp = a[j - 1];
                    a[j - 1] = a[j];
                    a[j] = temp;
                    // 设置标志位
                    flag = true;
                }
        }
    }

2、直接插入

基本思想:将需要排序的关键数与前面已经排好序的数据从后往前进行比较,使其插入到合适的位置

插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;

coding:

 public static void insertSort(int[] array) {
     for (int i = 1; i < array.length; i++) {
         int temp = array[i];
         int j = i - 1;
         for (; j >= 0 && array[j] > temp; j--) {
             //将大于temp的值整体后移一个单位
             array[j + 1] = array[j];
         }
         array[j + 1] = temp;
     }
     System.out.println(Arrays.toString(array) + " insertSort");
 }

冒泡排序是与插入排序拥有相等的运行时间,但是两种算法在需要的交换次数却很大地不同。在最坏的情况,冒泡排序需要次交换,而插入排序只要最多交换。冒泡排序的实现(类似下面)通常会对已经排序好的数列拙劣地运行(),而插入排序在这个例子只需要{\displaystyle O(n)}个运算。因此很多现代的算法教科书避免使用冒泡排序,而用插入排序取代之。

3、

时间: 2024-10-09 00:43:53

8大排序算法-我熟知(冒泡、直接插入)的相关文章

8大排序算法---我熟知3(归并排序/快速排序/堆排序)

排序算法: 快排: o(nlogn) o(1)不稳定 归并:o(nlogn) o(n) 稳定 基数: 冒泡 睡眠 面条 烙饼 1.quicksort: 返回条件:start >=end private = a[start]+a[end]/2 while(left <= right) while(left <= right && a[left] < privot) while(left <= right && a[right] > priv

8大排序算法-我熟知二(希尔、选择)

3.希尔排序(递减增量排序算法)不稳定的-- - - 直接插入排序的改进  .复杂度介于O(nlog^2n)~ O(n),空间是O(n) 基于插入排序的两点性质: 1.对于几乎已排好序的数组效率高,可达到线性 2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位 方法:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,可以让一个元素可以一次性地朝最终位置前进一大步.然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够

九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序

  闲着的时候看到一篇“九大排序算法在总结”,瞬间觉得之前数据结构其实都有学过,但当初大多数都只是老师随口带过,并没有仔细研究一下.遂觉:这是欠下的账,现在该还了.   排序按照空间分类: In-place sort不占用额外内存或占用常数的内存 插入排序.选择排序.冒泡排序.堆排序.快速排序. Out-place sort:归并排序.计数排序.基数排序.桶排序. 或者按照稳定性分类: stable sort:插入排序.冒泡排序.归并排序.计数排序.基数排序.桶排序. unstable sort

九大排序算法,你会几个?

概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]

九大排序算法Java实现

之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂度.稳定性分类: 2.排序算法问题描述与实现 2.1冒泡排序(交换排序-稳定) [问题描述]对于一个int数组,请编写一个冒泡排序算法,对数组元素排序. 问题分析:冒泡排序,顾名思义,从前往后遍历,每次遍历在末尾固定一个最大值. 易错点:每次内层循环结束都会在末尾确定一个元素的位置,因此内层循环的判

Java 常用排序算法/程序员必须掌握的 8大排序算法

Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n 个数插到前

十大排序算法总结

排序算法术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面:不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排序操作都在内存中完成:外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行: 时间复杂度: 一个算法执行所耗费的时间.空间复杂度: 运行完一个程序所需内存的大小. 排序算法图片总结(图片来源于网络) 图片名词解释:n: 数据规模k:"桶"的个数In-place: 占用常数内存,不占用额外内存

十大排序算法--多图预警

十大排序算法 十大排序算法 简单的排序算法 插入排序 冒泡排序 选择排序 高效的比较排序算法 希尔排序 快速排序 归并排序 堆排序 牺牲空间的线性排序算法 计数排序 桶排序 基数排序 综合分析 简单的排序算法 Θ(n^2) 插入排序 动画演示 enter description here 原理 将数组看成两部分,一部分为已排序好的数组,后面的部分为未排序数组,每次从后面的数组中取出元素与前面的有序元素一一比较,若小于则向前移动,直到找到正确的位置插入.遍历后面的数组直到整个数组排序完成. 代码