冒泡排序
更新日期:
冒泡排序
思想
降序道理相同,这里不再例举。
代码实现
flag标志位表示该数组是不是有序的,遍历依此如果有序,则直接break
void BubbSort(int* a, size_t size)
{
assert(a);
int flag = 1;
for (int i = 0; i < size; ++i)
{
for (int j = 1; j < size - i; ++j)
{
//升序
if (a[j - 1] > a[j])
{
swap(a[j - 1], a[j]);
flag = 0;
}
}
if (flag)
break;
}
}
优化版
代码描述:
情景:假如有个a[100],前50位是有序的,后50位无序,或者,前50无序,后50有序
综合以上情况,代码如下:
如果说 j-1 , j 这两个位置发生了交换,那么说明从j这个位置开始往后可能是无序的,如果有序,就不发生交换,cur == 0; 循环结束;如果无序,则cur !=0 ,接着往下冒泡,直到有序。
void BubbOptimizaSort(int* a, size_t size)
{
assert(a);
int cur = size;
while (cur > 0)
{
int tmp = cur; //保存size
cur = 0;
for (int j = 1; j < tmp; ++j)
{
if (a[j - 1] > a[j])
{
swap(a[j - 1], a[j]);
cur = j;
}
}
}
}