一、冒泡排序的三种表现形式
1.思路
1)比较前后两个数据,如果前面的数据大于后面,则交换
2)第0个数据到第N-1个数据进行一次遍历之后,最大的一个数据沉到数组的最后
3)N=N-1,如果N不为0就重复前面二步,否则排序完成。
第一种实现方法
void BubbleSort1(int a[], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
//长度越来越小
for (j = 1; j < n - i; j++)
{
if (a[j - 1] > a[j])
{
Swap(&a[j - 1], &a[j]);
}
}
}
}
第二种实现方法
设置了一个标志,如果某一趟比较没有发生交换,即a[0]<a[1]<a[2]…….<a[n],则无需在比较了
比第一种更优化时间复杂度为O(1)-O(n^2^)
void BubbleSort2(int a[], int n)
{
int j, k;
bool flag;
k = n;
flag = true;
while (flag)
{
flag = false;
for (j = 1; j < k; j++)
if (a[j - 1] > a[j])
{
Swap(&a[j - 1], &a[j]);
flag = true;
}
k–;
}
}
第三种实现方法
当有100个数,后90个数已经按从小到大排好序,之后前10个数需要排序,则第一趟遍历之后,只需要比较前面10个数就行了
void BubbleSort3(int a[], int n)
{
int j, k;
int flag;
flag = n;
while (flag > 0)
{
k = flag;
flag = 0;
for (j = 1; j < k; j++)
{
if (a[j - 1] > a[j])
{
Swap(&a[j - 1], &a[j]);
//把最后发生交换的位置赋给flag
flag = j;
}
}
}
}
总结:冒泡排序是一种效率低下的排序方法,在数据规模很小时,可以采用,数据规模比较大时,不适用
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!