渐渐的到了校园招聘的时候,楼主的算法功底实在是不敢恭维;上不及数据挖掘、模式识别、机器学习等高级算法,也只有加强好自己的基本功了,对数据结构和算法书上的基本的算法做分析和实现;就先从排序算法开始吧,本文主要分析楼主学到的第一个冒泡排序算法。

一. 算法描述

    冒泡排序:依次比较相邻的数据,将小数据放在前,大数据放在后;即第一趟先比较第1个和第2个数,大数在后,小数在前,再比较第2个数与第3个数,大数在后,小数在前,以此类推则将最大的数"滚动"到最后一个位置;第二趟则将次大的数滚动到倒数第二个位置......第n-1(n为无序数据的个数)趟即能完成排序。

以下面5个无序的数据为例:

40 8 15 18 12 (文中仅细化了第一趟的比较过程)

第1趟: 8 15 18 12 40


第2趟: 8 15 12 18 40

第3趟: 8 12 15 18 40

第4趟: 8 12 15 18 40

二. 算法分析

平均时间复杂度:O(n2)

空间复杂度:O(1)  (用于交换)

稳定性:稳定

三. 算法实现

//交换data1和data2所指向的整形
void DataSwap(int* data1, int* data2)
{
	int temp = *data1;
	*data1 = *data2;
	*data2 = temp;
}

/********************************************************
*函数名称:BubbleSort
*参数说明:pDataArray 无序数组;
*		   iDataNum为无序数据个数
*说明:    冒泡排序
*********************************************************/
void BubbleSort(int* pDataArray, int iDataNum)
{
	for (int i = 0; i < iDataNum - 1; i++)   //走iDataNum-1趟
		for (int j = 0; j < iDataNum - i - 1; j++)    
			if (pDataArray[j] > pDataArray[j + 1])
				DataSwap(&pDataArray[j], &pDataArray[j + 1]);
}

四. 算法优化

还可以对冒泡排序算法进行简单的优化,用一个标记来记录在一趟的比较过程中是否存在交换,如果不存在交换则整个数组已经有序退出排序过程,反之则继续进行下一趟的比较。

/********************************************************
*函数名称:BubbleSort
*参数说明:pDataArray 无序数组;
*		   iDataNum为无序数据个数
*说明:    冒泡排序
*********************************************************/
void BubbleSort(int* pDataArray, int iDataNum)
{
	BOOL flag = FALSE;    //记录是否存在交换
	for (int i = 0; i < iDataNum - 1; i++)    //走iDataNum-1趟
	{
		flag = FALSE;
		for (int j = 0; j < iDataNum - i - 1; j++)    
			if (pDataArray[j] > pDataArray[j + 1])
			{
				flag = TRUE;
				DataSwap(&pDataArray[j], &pDataArray[j + 1]);
			}
		
		if (!flag)    //上一趟比较中不存在交换,则退出排序
			break;
	}
}


感觉博文还是单薄了些,欠缺一些工程应用背景;希望有朋友能够一起讨论,一起温习曾经的基础。





Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐