改进的排序算法

之前写到几个排序的算法,例如:

//冒泡排序
void bubbleSort(unsigned char *list, int length)
{
    int i,j,temp;

    for(i = 0; i < length; i++)
    {
        for(j = 0; j < length - i - 1; j++)
        {
            if(list[j+1] < list[j])
            {
                temp = list[j + 1];
                list[j + 1] = list[j];
                list[j] = temp;
            }
        }
    }
}

原操作是数据的交换,算法时间复习度是O(n^2).

但假如我们需要排序的数据如: 一开始已经是排序好的如(1 2 3 5 6 9)或只需交换几次便能排序好的如(2 1 3 5 6 9),该算法后面的循环均在做无用功。

在这个时候我们只需要加入一个标志即可避免该情况。

//冒泡排序
void bubbleSort(unsigned char *list, int length)
{
    int i,j,temp;
    int flag;

    for(i = 0, flag = 1; i < length && flag; i++)
    {
        flag = 0;
        for(j = 0; j < length - i - 1; j++)
        {
            if(list[j+1] < list[j])
            {
                temp = list[j + 1];
                list[j + 1] = list[j];
                list[j] = temp;
                flag = 1;
            }
        }
    }
}

当在序列本身是正确的情况下,最佳情况下:时间复习度是O(n).

相关:观 数据与结构有感

时间: 2024-10-13 08:14:19

改进的排序算法的相关文章

算法—归并排序的改进及排序算法的极致

1.对小规模子数组使用插入排序 用不同的方法处理小规模问题能改进大多数递归算法的性能,因为递归会使小规模问题中方法的调用过于频繁,所以改进对它们的处理方法就能改进整个算法.对排序来说,我们已经知道插入排序(或者选择排序)非常简单,因此很可能在小数组上比归并排序更快.和之前一样,一幅可视轨迹图能够很好地说明归并排序的行为方式.图中的可视轨迹图显示的是改良后的归并排序的所有操作.使用插入排序处理小规模的子数组(比如长度小于15)一般可以将归并排序的运行时间缩短10%~15%. 2.测试数组是否已经有

排序算法到底能不能突破nlog(n)时间复杂度?

今天在刷算法意外发现排序算法通过二分查找改进可以得到log2(n!)的时间复杂度. 先看张各个时间复杂度的图形. 这是使用desmos画出来的图形.主要对比xlog(x), x^2, log(x!), log(x), x的图形. 再上张大点图片 通过图形对比log(x!)低于xlog(x)高于x,但通常我们的排序算法快排和归并的最优是xlog(x)最坏是n^2, 通过二分查找改进的排序算法最坏是log(n!),最好是n. 虽然nlog(n)和log(n!)相差不是特别大,我们可以看到当x=120

比较模型下的排序算法总结

说到算法,排序算法可能是大部分人最早接触的算法,我还记得我接触的第一个排序算法可能就是冒泡排序(bubble sort)了,估计不少同学和我一样吧.再后来接触到了插入排序(insertion sort),归并排序(merge sort),快速排序(quick sort),堆排序(heap sort),希尔排序(shell sort).如果回顾一下这些排序算法,仔细思考一下他们有什么共同点的话,你或许会发现他们都是通过比较一对对元素来实现排序的,这就是所谓的比较模型.这篇博客就将对比较模型下的常见

排序算法(二)——选择排序及改进

选择排序 基本思想 冒泡排序中有一个缺点,比如,我们比较第一个数a1与第二个数a2的时候,只要a1比a2大就会交换位置,但是我们并不能确定a2是最小的元素,假如后面还有比它更小的,该元素还会与a2再次进行交换,而且这种交换有可能发生多次才能确定a2的最终位置. 选择排序可以避免这种耗费时间的交换操作,从第一个元素开始,扫描整个待排数组,找到最小的元素放之后再与第一个元素交换位置,然后再从第二个元素开始,继续寻找最小的元素与第二个元素交换位置,依次类推. java实现 //选择排序 public

排序算法(三)——插入排序及改进

插入排序 基本思想 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数找到相应位置并插入,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. java实现 //插入排序 public void insertionSort(){ int len = array.length; int counter = 1; for(int i=1;i<len;i++){ int temp = array[i]; //存储待排序的元素值 int insertPo

改进的起泡排序算法--java

一.基本思路: 冒泡排序是一种简单的交换类排序.其基本思路是从头开始扫描待排序的元素,在扫描过程中依次对相邻元素进行比较,将关键字值大的元素后移.每经过一趟排序后,关键字值最大的元素将移到末尾,此时记下该元素的位置,下一趟排序只需要比较到此位置为止,直到所有元素都已有序排列. 一般地,对n个元素进行冒泡排序,总共需要进行n-1趟.第1趟需要比较n-1次,第2趟需要比较n-2次,......第i趟需要比较n-i次. 二.算法 2.1原始起泡排序算法 public static int[] bubb

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

排序算法总结

各种排序算法总结  排序算法  插入排序 冒泡排序  选择排序  归并排序  快速排序 堆排序  计数排序  基数排序  桶排序  思想  构建有序序列 两两交换 每次找一个最小值 分治法思想 分治法思想 最小堆.最大堆 数字本身的属性  对数据选择多种基数  函数的映射关系.Hash  数据结构  数组  数组  数组  数组 不定   数组 数组 数组  数组  最差时间复杂度 O(n^2)   O(n^2)   O(n^2)   O(n*lgn)  O(n^2).改进O(n*lgn)  O

七大常见排序算法总结

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.04.06 lutianfei none V1.1 2016.07.16 lutianfei 增加了归并排序说明 V2.0 2016.07.19 lutianfei 完善了排序算法的总结 排序另一种分法 外排序:需要在内外存之间多次交换数据才能进行 内排序: 插入类排序 直接插入排序 希尔排序 选择类排序 简单选择排序 堆排序 交换类排序 冒泡排序 快速排序 归并类排序 归并排序 排序方法 平均情况 最好情况 最坏情况