您的位置:首页 > 其它

经典排序算法----冒泡排序算法及其优化

2016-04-21 12:15 477 查看

概念:

设数组长度为N。

比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
N=N-1,如果N不为0就重复前面二步,否则排序完成。

算法实现

按照定义:
#include<stdio.h>
#include<stdlib.h>

void Show(int *arr, int n)
{
printf("数组排序:");
for (int i = 0; i < n; i++)
printf("%-3d", arr[i]);
printf("\n");
}

void Swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}

<span style="color:#ff0000;"><strong>void BubbleSort(int *arr, int n)
{
for (int i = 0; i < n; i++)
for (int j = 1; j < n - i; j++)
if (arr[j - 1] > arr[j])
Swap(&arr[j - 1], &arr[j]);
}</strong></span>

void main()
{
int arr[10] = { 9, 8, 7, 6, 4, 5, 3, 1, 2, 0 };
Show(arr, 10);
BubbleSort(arr, 10);
Show(arr, 10);

system("pause");
}
运行结果:
数组排序:9  8  7  6  4  5  3  1  2  0
数组排序:0  1  2  3  4  5  6  7  8  9
请按任意键继续. . .

优化一:

下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。

算法实现:

#include<stdio.h>
#include<stdlib.h>

void Show(int *arr, int n)
{
printf("数组排序:");
for (int i = 0; i < n; i++)
printf("%-3d", arr[i]);
printf("\n");
}

void Swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}

<span style="color:#ff0000;"><strong>void BubbleSort2(int *arr, int n)
{
int j, k;
int flag;

k = n;
flag = 1;

while (flag)
{
flag = 0;
for (j = 1; j < k; j++)
if (arr[j - 1] > arr[j])
{
Swap(&arr[j - 1], &arr[j]);
flag = 1;
}
k--;
}
}</strong></span>

void main()
{
int arr[10] = { 9, 8, 7, 6, 4, 5, 3, 1, 2, 0 };
Show(arr, 10);
BubbleSort2(arr, 10);
Show(arr, 10);

system("pause");
}
运行结果:
数组排序:9  8  7  6  4  5  3  1  2  0
数组排序:0  1  2  3  4  5  6  7  8  9
请按任意键继续. . .


优化二:

再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。

#include<stdio.h>
#include<stdlib.h>

void Show(int *arr, int n)
{
printf("数组排序:");
for (int i = 0; i < n; i++)
printf("%-3d", arr[i]);
printf("\n");
}

void Swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}

<span style="color:#ff0000;"><strong>void BubbleSort3(int *arr, int n)
{
int j, k;
int flag;

flag = n;
while (flag > 0)
{
k = flag;
flag = 0;
for (j = 1; j < k; j++)
if (arr[j - 1] > arr[j])
{
Swap(&arr[j - 1], &arr[j]);
flag = j;
}
}
}</strong></span>

void main()
{
int arr[10] = { 9, 8, 7, 6, 4, 5, 3, 1, 2, 0 };
Show(arr, 10);
BubbleSort3(arr, 10);
Show(arr, 10);

system("pause");
}


运行结果:

数组排序:9  8  7  6  4  5  3  1  2  0
数组排序:0  1  2  3  4  5  6  7  8  9
请按任意键继续. . .


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