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] viewplaincopy
//交换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;
}
}
相关文章推荐
- 经典算法之二:冒泡排序及优化
- 经典算法之冒泡排序
- 经典算法(7)- 冒泡排序(Bubble Sort)
- 冒泡排序的优化算法
- 白话经典算法系列之一 冒泡排序的三种实现
- 白话经典算法系列之一 冒泡排序的三种实现 .
- C语言经典算法:冒泡排序
- 冒泡排序以及冒泡排序的优化
- PHP算法学习之“简单的交换排序”,“冒泡排序”以及“改进后的冒泡排序”
- 经典算法回顾:冒泡排序(又称交换排序)
- 经典算法_冒泡排序
- 【经典算法】第五回:冒泡排序
- 白话经典算法系列之一 冒泡排序的三种实现
- 冒泡排序原理以及算法
- 经典算法详解 之 冒泡排序
- 经典算法之冒泡排序
- 海量数据库的查询优化以及分页算法[转]
- 经典算法详解 之 冒泡排序
- 白话经典算法系列之一 冒泡排序的三种实现
- Java经典算法:冒泡排序