前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(2)交换排序之冒泡排序

(2)交换排序之冒泡排序

作者头像
suveng
发布2019-09-17 10:23:34
4810
发布2019-09-17 10:23:34
举报

title: (2)交换排序之冒泡排序 date: 2019-02-10 13:00:00 +0800 update: 2019-02-10 13:00:00 +0800 author: me cover: http://ww1.sinaimg.cn/large/006jIRTegy1fzwiafdswej31jk0v9qp2.jpg preview: 冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后。 tags:

  • 算法

文章目录

  • (2)交换排序之冒泡排序
    • 算法步骤
    • 演示图
    • 时间复杂度
    • 空间复杂度
    • 稳定性
    • Java代码实现
      • (1) 没有任何优化
      • (2) 对本身有排序的进行优化
      • (3) 部分有序,部分无序
    • 参考文章
    • 我的主页
封面图
封面图

(2)交换排序之冒泡排序

算法步骤

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

演示图

演示图
演示图

时间复杂度

平均: O(n^2)

最好: O(n)

最差: O(n^2)

空间复杂度

O(1)

稳定性

稳定

Java代码实现

(1) 没有任何优化

代码语言:javascript
复制
class BubbleSortClass{
	public static void main(String[] args) {
		System.out.println("冒泡排序-没有优化的");
		int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22};
		System.out.println("原数组");

		for(int i:arr){
			System.out.print(i+",");
		}

		BubbleSortClass.BubbleSort(arr);
		System.out.printf("\n排序后的\n");

		for(int i:arr){
			System.out.print(i+",");
		}
	}
	public static void BubbleSort(int[] arr){
		int i ,j;
		int n=arr.length;
		for(i=0;i<n-1;i++){
			for(j=1;j<n-i;j++){
				if(arr[j-1]>arr[j]){
					int temp=arr[j-1];
					arr[j-1]=arr[j];
					arr[j]=temp;
				}
			}
		}
	}
}

(2) 对本身有排序的进行优化

如果对于一个本身有序的序列,或则序列后面一大部分都是有序的序列,上面的算法就会浪费很多的时间开销,这里设置一个标志flag,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。

代码语言:javascript
复制
class BubbleSortClass{
	public static void main(String[] args) {
		System.out.println("冒泡排序-没有优化的");
		int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22};
		System.out.println("原数组");

		for(int i:arr){
			System.out.print(i+",");
		}

		BubbleSortClass.BubbleSort(arr);
		System.out.printf("\n排序后的\n");

		for(int i:arr){
			System.out.print(i+",");
		}
	}
	public static void BubbleSort(int[] arr){
		int i ,j;
		int n=arr.length;
		//设置标志
		boolean flag = true;
		
		while(flag){
			//进来先设置为false
			flag = false;

			for(j=1;j<n;j++){
				if(arr[j-1]>arr[j]){
					int temp=arr[j-1];
					arr[j-1]=arr[j];
					arr[j]=temp;

					//如果数据进行交换,证明仍需要进行排序
					flag=true;
				}
			}
			//一次排序后,已经确定一位
			n--;
		}
	}
}

(3) 部分有序,部分无序

现在有一个包含1000个数的数组,仅前面100个无序,后面900个都已排好序且都大于前面100个数字

代码语言:javascript
复制
class BubbleSortClass{
	public static void main(String[] args) {
		System.out.println("冒泡排序-没有优化的");
		int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22};
		System.out.println("原数组");

		for(int i:arr){
			System.out.print(i+",");
		}

		BubbleSortClass.BubbleSort(arr);
		System.out.printf("\n排序后的\n");

		for(int i:arr){
			System.out.print(i+",");
		}
	}
	public static void BubbleSort(int[] arr){
		int i ,j;
		int n=arr.length;
		//需要排序的边界,刚开始为n
		int border = n;

		//border=0 可以不用排序
		while(border>0){
			//边界后的已经是有序的
			n=border;
			border = 0;
			
			for(j=1;j<n;j++){

				if(arr[j-1]>arr[j]){
					int temp=arr[j-1];
					arr[j-1]=arr[j];
					arr[j]=temp;

					//如果数据进行交换,证明仍需要进行排序,将边界设置为j
					border=j;
				}

			}
		}
	}
}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年02月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • (2)交换排序之冒泡排序
    • 算法步骤
      • 演示图
        • 时间复杂度
          • 空间复杂度
            • 稳定性
              • Java代码实现
                • (1) 没有任何优化
                • (2) 对本身有排序的进行优化
                • (3) 部分有序,部分无序
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档