冒泡排序
核心思想
相临两个元素进行大小比较,如果前一个比后一个大,则二者发生交换
优化
- (次优化)解决来数据就有序的情况——记录交换个数,一次也不交换就是有序数组
- (趟优化)遍历趟数冗余——记录上一次最后一个操作位置
——一开始 0~n-2 n - 1 趟
n-2 - i + 1 = flag - 1
i = n - flag
实现时有一个 i ++ 需要 -1 平衡
所以 i = n - flag - 1
代码
#include<stdio.h>
void BubbleSort(int arr[],int nlength)
{
if(arr == NULL || nlength <= 0) return;
int i;
int j;
int pMark;
for(i = 0; i < nlength - 1; i ++ )
{//趟
pMark = 0;
for(j = 0 ; j < nlength - 1 - i ; j ++ )
{//次
if(arr[j] > arr[j + 1])
{
pMark = j + 1; // 1.记录交换了多少次
// 2.记录上一次最后的交换为位置
arr[j] = arr[j]^arr[j + 1];
arr[j + 1] = arr[j]^arr[j + 1];
arr[j] = arr[j]^arr[j + 1];
}
}
if(pMark == 0)
{
break;
}
i = nlength - pMark - 1 ;
/* 趟数优化i + 1 表示已经交换完成了多少次
nlength - 1 - i + 1 = pMark剩余应该交换多少次
for循环自带一个i ++ 所以 - 1 */
}
}