您的位置:首页 > 移动开发 > IOS开发

ios之经典算法冒泡排序以及优化

2014-12-06 20:06 225 查看


一. 算法描述

冒泡排序:依次比较相邻的数据,将小数据放在前,大数据放在后;即第一趟先比较第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) (用于交换)

稳定性:稳定


三. 算法实现

[cpp] view
plaincopy

//交换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]);

}


四. 算法优化

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

[cpp] view
plaincopy

/********************************************************

*函数名称: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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: