冒泡排序改进算法

先上一段传统的选择排序的代码:

public class SortTest2
{
    public static void main(String[] args)
    {
        int[] a = new int[args.length];
        for(int i=0; i<args.length; i++)
        {
            a[i] = Integer.parseInt(args[i]);
        }

        print(a);
        selectSort(a);
        print(a);

    }

    private static void selectionSort(int[] a)
    {
        int tmp;
        for(int i=0; i<a.length; i++)
        {
            for(int j=i+1; j<array.length; j++)
            {
                if(array[j]<array[j])
                {
                    tmp = array[j];
                    array[j] = array[i];
                    array[i] = tmp;
                }
            }
        }
    }

    private static void print(int[] a)
    {
        for(int i=0; i<a.length; i++)
        {
            System.out.print(a[i] + " ");
        }
        System.out.println();
    }
}

重点看selectionSort方法,当i=0时,依次和后面的每个数字比较,如果有比a[i]更小的数字,则二者交换位置,然后新的a[i]再和后面的数字比较,再有更小的再交换一次。

下面是改进的selectionSort代码:

private static void selectionSort(int[] a)
    {
        int n,tmp;
        for(int i=0; i<a.length; i++)
        {
            n = i;

            for(int j = n+1; j<a.length; j++)
            {
                if(a[j] < a[n])
                {
                    n = j;
                }
            }

            if(n != i)
            {
                tmp = a[n];
                a[n] = a[i];
                a[i] = tmp;
            }
        }
    }

其实没必要每次都交换,可以暂时先记住比a[i]更小的位置n,用a[n]再和后面的数字进行比较,有更小的再记住,一直比较到数组的最后,然后再和a[i]进行交换,可以提高效率。

时间: 2024-08-02 16:10:39

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

算法基础之排序(1)--冒泡排序 改进

1 /********************************************************************************************************** 2 * Function : test 3 * Create Date : 2014/03/23 4 * Author : NTSK13 5 * Email : [email protected] 6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性

冒泡排序及其算法优化分析

1.基本冒泡排序 冒泡排序的基本思想:假设被排序的记录数组d[1...N]垂直竖立,将每个记录d[i]看作是一个气泡,那么重的气泡就会向下下沉,轻的气泡就会向上升.每次都是相邻的两个气泡d[i]和d[i+1]进行比较.如果d[i]>d[i+1],那么就交换两个气泡,然后在比较d[i+1]和d[i+2],以此类推,知道所有的气泡都有序排列.假设排序20,37,11,42,29. 第1次冒泡:20.37,11,42,29 d[0]和d[1]比较 第2次冒泡:20,11,37,42,29 d[1]和d

冒泡排序(算法源码)

算法源码: //BubbleSort.cpp #include <iostream>using namespace std; void BubbleSort(int a[], int n){ for(int i=n-1;i>0;i--) {for(int j=0;j<i;j++) { if (a[j]>a[j+1]) { int tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; } } }}int main(){ int a[]={4,3,6,

读论文《BP改进算法在哮喘症状-证型分类预测中的应用》

总结: 一.研究内容 本文研究了CAL-BP(基于隐层的竞争学习与学习率的自适应的改进BP算法)在症状证型分类预测中的应用. 二.算法思想 1.隐层计算完各节点的误差后,对有最大误差的节点的权值进行正常修正,  而对其它单元的权值都向相反方向修正,用 δ表示隐层节点的权值修正量, 则修正量的调整公式具体为 2.每次算法迭代完以后,计算误差函数的值并与前一次的值进行比较,如果误差函数的值增大,     则代表过调了学习率,应在下一次迭代时以一定比率下调学习率 ],若误差函数的i+1值减小,    

排序系列 之 简单选择排序及其改进算法 —— Java实现

简单选择排序算法: 基本思想: 在待排序数据中,选出最小的一个数与第一个位置的数交换:然后在剩下的数中选出最小的数与第二个数交换:依次类推,直至循环到只剩下两个数进行比较为止. 实例: 0.初始状态 3,1,5,7,2,4,9,6(共8个数) 1.n=8 个数中,最小数值为1,与第一个数交换:1,3,5,7,2,4,9,6 2.剩下 n-1=7 个数中,最小数值为2,与第二个数交换:1,2,5,7,3,4,9,6 3.剩下 n-2=6 个数中,最小数值为3,与第三个数交换:1,2,3,7,5,4

交换排序 —— 冒泡排序 + 改进

冒泡排序 冒泡排序是通过无序区相邻两个元素之间进行比较和位置交换,达到排序的目的. 插入排序是设定序列的 1 到 n-1 元素为无序区,初始有序区就只有 0 这个元素,然后将无序区中的元素和有序区中的元素逐个进行比较插入.从而是不断扩大有序区的范围.减少无序区的范围直至排序完成. 而冒泡排序则视整个序列均为无序区.即从 0 到 n-1 这些元素都位于无序区.直接对其中的元素进行比较,根据相邻元素大小比较的结果和想要的最终排序结果,对相邻元素的位置进行调整. 如:想要从小到大的排序结果,那么就对相

KMP及其改进算法

本文主要讲述KMP已经KMP的一种改进方法.若发现不正确的地方,欢迎交流指出,谢谢! KMP算法的基本思想: KMP的算法流程: 每当一趟匹配过程中出现字符比较不等时,不需回溯 i 指针,而是利用已经得到的部分匹配的结果将模式向右滑动尽可能远的一段距离后,继续进行比较. 设S为目标串,T为模式串,设 i 指针和 j 指针分别指示目标串和模式串中正待比较的字符. 开始时,令i=0,j=0.如果Si==Tj,则使i和j的值分别增加l:反之,i不变,j的值退回到j=next[j]的位置(即模式串右滑)

POJ 3155 Hard Life(最大密度子图+改进算法)

Hard Life Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 9012   Accepted: 2614 Case Time Limit: 2000MS   Special Judge Description John is a Chief Executive Officer at a privately owned medium size company. The owner of the company has

连通性问题改进算法

在上一篇“连通性问题”中已经对这个问题进行来介绍,在这一篇中给出针对以上问题的改进,在代码中已经对原理进行来注释. 加权快速合并算法 1 /** 2 * @file weightedquickunion.c 3 * @brief 加权快速合并算法 4 * 在合并操作中,不是任意把第二棵树连接到第一棵树上,而是记录每棵树中的节点数, 5 * 总是把较小的树连接到较大的树上.这个程序是对快速合并算法的改进,用另一个数组 6 * sz记录每个id[i]==i的对象所在树中的节点数,使得合并操作能够将较