排序算法之从冒泡排序所想到的

排序算法之从冒泡排序所想到的

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

1、算法思想描写叙述:

 1)将相邻的两个数进行比較,假设前面的一个大于后面的一个,则将他们交换。每次循环能使一个数达到有序状态。


2、时间复杂度:

    平均O(n^2)。最佳:O(n),在序列一開始就是正序的时候取得


3、实现及优化。

下面给出三种实现方式

/*
 * bubblesort.cpp
 *
 *  Created on: 2014年5月17日
 *      Author: pc
 */


#include <iostream>
#include <cstdio>
#include <ctime>

using namespace std;


const int maxn = 10;
int arr[maxn];

/**
 * 第一种交换算法:
 * 借助中间变量
 */
void swap1(int arr[],int i,int j){
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}

/**
 * 另外一种交换算法:
 * 不借助中间变量,使用算术运算
 */
void swap2(int arr[],int i, int j){
	arr[i] = arr[i] + arr[j];
	arr[j] = arr[i] - arr[j];
	arr[i] = arr[i] - arr[j];
}

/**
 * 第三种交换算法:
 * 使用位运算
 */
void swap3(int arr[], int i, int j){
	arr[i] = arr[i]^arr[j];
	arr[j] = arr[i]^arr[j];
	arr[i] = arr[i]^arr[j];
}

/**
 * 冒泡排序的第一种方式:
 * 标准方式
 */
void bubblesort1(int arr[],int n){
	int i;
	int j;
	for(i = 0 ; i < n ;++i){//循环n-1次,每次能是一个数达到有序状态
		for(j = 0 ; j < n-i-1 ; ++j){//每次将从第一个数到有序状态之前的数进行比較(有序状态以后的数不再须要进行比較)
			if(arr[j] > arr[j+1]){//假设前面的数大于后面的数
				swap3(arr,j,j+1);//则进行交换
			}
		}
	}
}

/**
 * 冒泡排序的另外一种方式:採用"扫描一遍以后,假如没有发生交换,即是达到了有序状态"的特点进行优化
 */
void bubblesort2(int arr[],int n){
	int k = n;
	bool flag = true;
	while(flag){
		flag = false;
		for(int j = 0 ; j < k-1 ; ++j){
			if(arr[j] > arr[j+1]){
				swap3(arr,j,j+1);
				flag = true;//用来标记这一次是否发生了交换
			}
		}
		--k;
	}
}

/**
 * 冒泡排序的第三种方式:在另外一种的基础上,用于处理"假如有100个数据,假如后90个都已经有序的情况"
 */
void bubblesort3(int arr[],int n){
	int k;
	int flag = n;
	while(flag > 0){
		k = flag;
		flag = 0;
		for(int j = 1 ; j < k ; ++j){
			if(arr[j-1] > arr[j]){
				swap3(arr,j-1,j);
				flag = j;//对方式2的改进...用来标记发生交换的是哪一个位置
			}
		}
	}
}

void createReverseArr(){
	int i = 0;
	for(i = 0 ; i < maxn ; ++i){
		arr[i] = maxn - i;
	}
}

void printArr(){
	int i;
	for(i = 0 ; i < maxn ; ++i){
		printf("%d " , arr[i]);
	}

	printf("\n");
}

time_t printTime(string str){
	time_t now = time(NULL);
	cout <<  str <<": "<<now <<endl;

	return now;
}

/**
 * 获取系统当前时间
 */
time_t getTime(){
	time_t now = time(NULL);
	return now;
}

int main(){
	createReverseArr();

	printArr();

	time_t before = getTime();
	bubblesort3(arr,maxn);
	time_t after = getTime();

	printArr();
	cout<< "cost: "<<after - before <<"s"<<endl;

}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118111.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DNS服务器列表

    DNS服务器列表PublicDNS+IPv4地址首选:119.29.29.29AliDNS 阿里公共DNSIPv4地址首选:223.5.5.5备用:223.6.6.6114DNS常规公共DNS(干净无劫持)首选:114.114.114.114、备选:114.114.115.115拦截钓鱼病毒木马网站(保护上网安全)首选:114.114.114.119、备用:114.11…

    2022年4月30日
    55
  • 如何编写优秀的单元测试用例「建议收藏」

    如何编写优秀的单元测试用例「建议收藏」优秀单元测试的定义​单元测试:一段自动化的代码,这段代码调用被测试的工作单元,之后对这个工作单元的单个最终结果的某些假设进行检验。单元测试几乎都是用单元测试框架进行编写。单元测试容易编写,快速运行,可自动化,可靠,可读,可维护,结果稳定。  集成测试:对一个工作单元进行的测试,这个测试对被测试的工作单元没有完全的控制,并使用该单元的一个或多个真实依赖物,例如数据库、系统时间、系统文件等  工作单元:从调用系统一个公共方法到产生一个测试可见的最终结果,其间这个系统发生的行为。一个

    2022年6月15日
    39
  • Qt中文本编辑器实现语法高亮功能(Qscitinlla)

    Qt中文本编辑器实现语法高亮功能(Qscitinlla)

    2021年11月19日
    20
  • jenkins 邮件_jmeter测试报告生成

    jenkins 邮件_jmeter测试报告生成前言前面已经实现在jenkins上展示html的测试报告,接下来只差最后一步,把报告发给你的领导,展示你的劳动成果了。安装EmailExtensionPlugin插件jenkins首页-

    2022年7月31日
    6
  • 物联网架构在现有互联网_物联网行业发展现状及整体体系结构

    物联网架构在现有互联网_物联网行业发展现状及整体体系结构1.说明  这一小节,也不具体讲些什么了。最近一个半月都在摸鱼,没什么事做,慢慢学习着SpringBoot和SpringCloud。下面两张图是进行的一次小结。以后随着深入,整个架构肯定是会变的。现在记录一下,每个项目成长都是有一个过程的。…

    2022年9月18日
    5
  • linux系统怎么看内存使用率_cpu使用率0

    linux系统怎么看内存使用率_cpu使用率0一、查看CPU使用率1.top命令top命令可以看到总体的系统运行状态和cpu的使用率。%us:表示用户空间程序的cpu使用率(没有通过nice调度)%sy:表示系统空间的cpu使用率,主要是内核程序。%ni:表示用户空间且通过nice调度过的程序的cpu使用率。%id:空闲cpu%wa:cpu运行时在等待io的时间%hi:cpu处理硬中断的数量%si:cpu处理软中断…

    2025年8月29日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号