冒泡排序C++

<pre name="code" class="cpp">/*
 * buble_sort.cpp
 *
 *  Created on: 2016-3-17
 *      Author: LvLang
 */

//冒泡排序C++实现
#include <iostream>
using namespace std;

void swap(int *array,int j)
{
	int temp = array[j];
	array[j] = array[j+1];
	array[j+1] = temp;
}

/*冒泡排序思路步骤:
1、从数组的第一位开始,依次跟它后面的一位比较大小,把大的交换到后面去
2、第一轮从第一位到倒数第二位(i)都跟后面的一位比较并作可能的交换,
      这轮过后数组最后的元素时最大的
3、重复上面的两个步骤,但是排除最后一个元素(因为是最大已排序)
  (--用一个值[len-1-i]去反映),
     也就是从第一位到倒数第三位都跟它后面的一位比较并作可能的交换
4、最后当len-1-i = 0时终止,得到了排好序的数组
5、要注意将冒泡排序和选择排序区别开来,
      最大的区别是选择排序是每次把最大的找出来放到最前面,
      而冒泡排序是两两比较交换,自动将最大值放最后。*/

/*冒泡排序时间复杂度分析:
时间复杂度O(n^2), 空间复杂度O(1), 稳定,因为存在两两比较,不存在跳跃。
排序时间只跟数组大小有关,与输入情况无关,最好,最差,平均都是O(n^2)。
最坏情况,每次两两比较都要交换,那第一次交换了n-1次,第二次交换了n-2次,
第i次交换了n-i次,直到交换0次,所以总交换次数为1+2+…+n-1 = n(n-1)/2,
也就是O(n^2)的复杂度(加上两两比较的总共O(n^2)时间复杂度)。
最好情况下但依然要有n^2平方次的两两比较,所以是同样的时间复杂度*/

/*
 * 顺带提提eclipse注释快捷键,"ctrl+/"——双斜杠注释,取消同样;
 *	"ctrl+shift+/"——斜杠星注释 ,取消用“ctrl+shift+\”
*/
void buble_sort(int *array,int len)
{
	int i,j;
	for(i = 0;i <= len-2;i++)
	{
		for(j=0;j <= len-2-i;j++)
		{
			if(array[j] > array[j+1])
				swap(array,j);
		}
	}
}

void print(int *array,int len)
{
	for(int i=0;i <= len-2;i++)
		cout<<array[i]<<" ";
	cout<<array[len-1]<<endl;
}

int main()
{
	int len;
	cin>>len;
	int *array = new int[len];
	for(int i=0;i<len;i++)
	{
		cin>>array[i];
	}
	cout<<"排序之前数组:"<<endl;
	print(array,len);
	buble_sort(array,len);
	cout<<"排序之后数组:"<<endl;
	print(array,len);

	return 0;
}




 
 
 
 

运行结果:

冒泡排序C++_第1张图片


冒泡排序还可以改进:

学习自该博客:

点击打开链接

改进方法其实只针对序列一开始就有序的情况,当前的冒泡排序即便序列从一开始就有序,但仍会进行遍历,所以改进方法就是判断第一次遍历如果连一次交换都没有,那证明了原本序列就是有序的,后面就不用再继续遍历而是直接跳出排序了。但是往往序列是无序,所以这个的改进用到的地方不多。同时,这个改进方法一样可以用于其他的排序算法当中,减少没必要的遍历或者切分。

你可能感兴趣的:(冒泡排序)