在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较小的数往下沉,较大的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
简单实现:
-
void bubblesort(int list[], int len)
-
{
-
int i,j;
-
int temp;
-
-
for (i = 0; i < len; i)
-
{
-
for(j = 0; j < len - 1; j)
-
{
-
if (list[j] > list[j1])
-
{
-
temp = list[j];
-
list[j] = list[j 1];
-
list[j 1] = temp;
-
}
-
-
}
-
}
-
}
见上面程序段,第一个for循环中循环次数是len 次,但实际上,大多数情况下,不需要比较完len趟,序列已经处于有序状态了;因此,一个常见的改进是,在比较过程中加入一个flag,记录某一趟比较中是否发生了交换,如果没有交换发生,表明已经有序了,完成排序。另一方面,第二个for循环中,循环次数也是len-1次,但实际上,随着每一趟完成,队尾的数都是有序状态,因此不必要重复比较;另一个改建就是加入一个“有序队列”的标记,之后的数据都是有序的,无需比较。
改进算法实现如下:
-
void bubblesort2(int list[], int len)
-
{
-
int flag;
-
int sortedidx = len - 1;
-
int temp;
-
-
int i;
-
-
// force to run at first
-
flag = 1;
-
while (flag == 1)
-
{
-
flag = 0;
-
-
for(i = 0; i < sortedidx; i)
-
{
-
if (list[i] > list[i 1])
-
{
-
temp = list[i];
-
list[i] = list[i1];
-
list[i1] = temp;
-
-
flag = 1;
-
}
-
}
-
sortedidx--;
-
}
-
-
}
阅读(2075) | 评论(0) | 转发(0) |