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

一、基本思路:

冒泡排序是一种简单的交换类排序。其基本思路是从头开始扫描待排序的元素,在扫描过程中依次对相邻元素进行比较,将关键字值大的元素后移。每经过一趟排序后,关键字值最大的元素将移到末尾,此时记下该元素的位置,下一趟排序只需要比较到此位置为止,直到所有元素都已有序排列。

一般地,对n个元素进行冒泡排序,总共需要进行n-1趟。第1趟需要比较n-1次,第2趟需要比较n-2次,......第i趟需要比较n-i次。

二、算法

2.1原始起泡排序算法

public static int[] bubbleSort1(int [] arr)
	{
		int temp;//临时变量
		int count=arr.length;//数组长度

		//控制循环次数(实际是count-1次、只不过此处最后一次内部循环已经结束,不影响)
		for(int i=0;i<count;i++)
		{
			//第i趟排序时需要进行count-i次比较
			for(int j=0;j<count-i-1;j++)
			{
				if(arr[j]>arr[j+1])
				{
					//交换数据
					temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			}
		}

	return arr;
	}

2.2第一种改进 (在原始算法基础上)

用flag字段控制循环的趟数,当某一趟比较下来,没发生数据交换时说明数据都是有序的,就没必要进行下一趟的比较了

public static int[] bubbleSort2(int [] arr)
	{
		int temp;//临时变量
		int count=arr.length;//数组长度

		boolean flag;
		//控制循环次数(实际是count-1次、只不过此处最后一次内部循环已经结束,不影响)
		for(int i=0;i<count;i++)
		{
			flag=false;
			//第i趟排序时需要进行count-i次比较
			for(int j=0;j<count-i-1;j++)
			{
				if(arr[j]>arr[j+1])
				{
					//交换数据
					temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;

					flag=true;
				}
			}
			// 如果上一次扫描没有发生交换,则说明数组已经全部有序,退出循环
			if(!flag)
			{
				break;
			}
		}
		return arr;

	}

2.3第二种改进(在原始算法基础上)

第一种是用flag 控制循环趟数来较少循环比较次数,此种方法是用一个变量lastPos保存每一趟最后进行数据交换的位置,在下一趟循环的时候只需要比较arr[0...lastPos]即可,而arr[lastPos...n]已经有序了。

public static int[] bubbleSort3(int [] arr)
	{
		int temp;//临时变量

		int lastPos=arr.length-1;//保存每趟最后交换的下标,控制每趟比较的次数
		int flagPos=0;//临时变量

		//控制循环次数(实际是arr.length-1次)
		for(int i=0;i<arr.length;i++)
		{		

			//第i趟排序时需要进行arr.length-i次比较,lastPos为上次交换的位置
			for(int j=0;j<lastPos;j++)
			{
				if(arr[j]>arr[j+1])
				{
					//交换数据
					temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;

					flagPos=j;

				}
			}

			lastPos=flagPos;//作为下次比较的最后下标
		}
		return arr;

	}

2.4 第三种改进(第一和第二种的合并 ,性能是较一二好,取一和二的长处合并)

flag控制循环趟数,lastPos控制每趟循环的的最后下标

public static int[] bubbleSort4(int [] arr)
	{
		int temp;//临时变量
		boolean flag;//控制循环趟数
		int lastPos=arr.length-1;//保存每趟最后交换的下标,控制每趟比较的次数
		int flagPos=0;//临时变量

		//控制循环次数(实际是arr.length-1次)
		for(int i=0;i<arr.length;i++)
		{
			flag=false;
			//第i趟排序时需要进行arr.length-i次比较,lastPos为上次交换的位置
			for(int j=0;j<lastPos;j++)
			{
				if(arr[j]>arr[j+1])
				{
					//交换数据
					temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;

					flagPos=j;
					flag=true;
				}
			}

			lastPos=flagPos;
			// 如果上一次扫描没有发生交换,则说明数组已经全部有序,退出循环
			if(!flag)
			{
				break;
			}
		}
		return arr;

	}
时间: 2024-12-13 15:41:28

改进的起泡排序算法--java的相关文章

排序算法Java实现

排序算法Java实现 排序算法的分类: 内部排序,在排序过程中,全部记录放在内存中,称为内部排序: 外部排序,在排序过程中需要使用外部存储(磁盘),则称为外部排序. 主要介绍内部排序: 插入排序:直接插入排序.二分法插入排序.希尔排序 选择排序:简单选择排序.堆排序 交换排序:冒泡排序.快速排序 归并排序 基数排序 插入排序 直接插入排序 基本思想:对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余记录为无序序列.接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的

经典排序算法(Java实现)

以下程序均将数据封装于DataWrap数据包装类中,如下所示: 1 //数据包装类 2 class DataWrap implements Comparable<DataWrap> 3 { 4 int data; 5 String flag; 6 public DataWrap(int data,String flag) 7 { 8 this.data = data; 9 this.flag = flag; 10 } 11 //重写compareTo方法 12 public int compa

数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 <数据结构(c语言版)>严蔚敏 吴伟民编著. 里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩. package test.sort; /** * @Title: TODO * @Description: TODO * @author: * @date: 2014-8-10 上午11:20:43 * */ public class quickSort { private static int datas[] = {23,42,12,45,56,63,

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

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

九大排序算法Java实现

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

八大排序算法Java(转)

目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择排序堆排序Heap Sort 交换排序冒泡排序Bubble Sort 交换排序快速排序Quick Sort 归并排序Merge Sort 桶排序基数排序Radix Sort 总结 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序

排序算法 java实现

几个排序算法,我是按照算法的伪代码用java实现的,刚开始是int类型的,后来换成泛型. 这是好早之前写的代码了,现在那出来温习下,就当是准备面试把 1.简单选择排序 这个算法应该是最简单的把,就是在数组中从头开始循环,选择最小的放在最前面,这个应该很好实现就不废话了 public static <T extends Comparable<T>> T[] genericsimpleselectionsort(T[] a){ for (int i = 0; i < a.leng

排序算法 java实现2

继续排序算法 4.冒泡排序 从第一个开始,跟后面一个数比较,如果比后面大就交换位置,这样没完成一轮,就可以把最大的选出来 public static <T extends Comparable<T>> T[] genericBubbleSort(T[] a) { int n = a.length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (a[j].compar

八大排序算法JAVA实现(时间复杂度O(n*logn)篇)

本文讲述时间复杂度为n*logn的排序算法:归并排序.快速排序.堆排序以及希尔排序的原理.Java实现以及变形应用. 一.归并排序 原理:把两个有序数列合并为一个有序数列.需递归实现. Java实现: 1 public int[] mergeSort(int[] a, int n) 2 { 3 return doMergeSort(a, n, 0, n - 1); 4 } 5 public int[] doMergeSort(int[] a, int n, int start, int end)