冒泡排序--两种优化方式

原始版本

void bubble_sort(int arr[],int n){
    int tmp;
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; i < n; ++j)
        {
            if (arr[j] < arr[j+1])
            {
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}

优化版本一

 如果内层循环没有进行交换,说明后面的元素已经有序,则不需要继续循环。因此,我们可以设置一个标记来标志一趟比较是否发生交换。如果没有发生交换,则数组已经有序。

void bubble_sort(int arr[],int n){
    int tmp;
    int flag ;
    for (int i = 0; i < n; ++i)
    {
        flag = false;
        for (int j = 0; i < n; ++j)
        {
            if (arr[j] < arr[j+1])
            {
                flag = true;
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
        if (!flag)
            break;
    }
}

优化版本二

  如果数组A[i....n]已经有序,那么,内层循环只需要遍历A[0....i]即可。因此,我们可以使用一个临时变量来记录最后一次交换的数组下标。

  

void bubble_sort(int arr[],int n){
    int tmp;
    int flag ;
    int k = n;
    int s = 0;
    for (int i = 0; i < n; ++i)
    {
        flag = false;
        for (int j = 0; i < k; ++j)
        {
            if (arr[j] < arr[j+1])
            {
                flag = true;
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
                s = j;//保存最后一次交换的下标;
            }
        }

        if (!flag)
            break;
        k = s;//最后一次交换的位置给k,减少比较的次数;
    }
}
时间: 2024-12-18 11:35:37

冒泡排序--两种优化方式的相关文章

冒泡排序及两种优化方式

冒泡排序是最常用的小型数据排序方式,下面是用C语言实现的,及其两种优化方式. 第一种优化方式是设置一个标记位来标记是否发生了交换,如果没有发生交换就提前结束: 第二种优化方式是记录最后放生交换的位置,作为下一趟比较结束的位置. #include <stdio.h> /* * 打印数组 * */ void printArray(int arr[], int n) { int i = 0; for (i = 0; i < n; ++i) { printf("%d ", a

冒泡排序算法及其两种优化

冒泡排序算法及其两种优化 1.排序方法 将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡.根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮".如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止. (1)初始    R[1..n]为无序区. (2)第一趟扫描    从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下.重者在上,则交换二者的位置.即依次比较(R[n],R[n-1

冒泡排序的两种实现方式

冒泡排序是算法中比较重要的知识点,也是程序员必备的知识点. 有两种实现方式: 第一种是两层循环的实现方式: 1:双层for循环嵌套: 2.判断条件如果满足,交换两数位置: public static void main(String[] args) { int[] arr = new int[]{3,1,2,5,6}; // 定义数组 int[] arr = {3,1,2,5,6}; // 或者使用这样定义数组的方式 for(int i= 0; i < arr.length; i++){ //第

Redis两种持久化方式(RDB&amp;AOF)

爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Redis并发锁 windows下redis基础操作与主从复制 从而 数据备份和读写分离 Redis两种持久化方式(RDB&AOF) Redis的持久化过程中并不需要我们开发人员过多的参与,我们要做的是什么呢?除了深入了解RDB和AOF的作用原理,剩下的就是根据实际情况来制定合适的策略了,再复杂一点,也就

自制Javascript分页插件,支持AJAX加载和URL带参跳转两种初始化方式,可用于同一页面的多个分页和不同页面的调用

闲话部分 最近闲着实在无聊,就做了点小东西练练手,由于原来一直在用AspNetPager进行分页,而且也进行了深度的定制与原有系统整合的也不错,不过毕竟是用别人的,想着看自己能试着做出来不能,后台的分页插件已经有比较成熟的了,那就自己试着写一个前台分页吧. 话不多说,先上效果图: 优点与缺点 来说说优缺点吧,首先AspNetPager是后台分页控件,所以在向客户端回传HTML文档之前生成HTML阶段 就会把分页代码生成完毕,然后回传,而JS是前端代码,就是HTML文档在服务器组织完毕往客户端传送

Android 进阶6:两种序列化方式 Serializable 和 Parcelable

什么是序列化 我们总是说着或者听说着"序列化",它的定义是什么呢? 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 二进制序列化保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用.例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象.您可以将对象序列化到流.磁盘.内存和网络等等.远程处理使用序列化&

Android中BroadcastReceiver的两种注册方式(静态和动态)详解

今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来接收来自系统和应用中的广播.在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能:当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作:当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户

Java多线程13:读写锁和两种同步方式的对比

读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有 完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务),但是效率非常低.所以在JDK中提供了一种读写锁 ReentrantReadWriteLock,使用它可以加快运行效率. 读写锁表示两个锁,一个是读操作相关的锁,称为共享锁:另一个是写操作相关的锁,称为排他锁.我把这两个操作理解为三句话: 1.读和读之间不互斥,因为读操作不会有线程安全问题 2.

算法整理(二)---快速排序的两种实现方式:双边扫描和单边扫描

首先简单谈下快速排序的特点,时间复杂度O(nLog n),最差时间复杂度O(n^2),平均时间O(nLog n).因为用到了函数栈,空间复杂度为O(lg n),最差为O(n).是一种不稳定的排序方法.基本思想是分治法,这位大大的http://blog.csdn.net/morewindows/article/details/6684558 讲的非常清楚了,分治法+挖坑法,我就不多说了.就是以某个数为参照,使得左边的都小于他,右边的数都大于他.然后对他的左右两个区间采取同样的方法进行递归. 就其整