排序专题之冒泡排序

  • 冒泡排序原理
    (1)将整个待排序的记录序列划分成有序区和无序区。初始状态有序区为空,无序区 包括所有待排序的记录。
    (2)对无序区从前向后依次将相邻记录的关键字进行比较,若逆序则将其交换,从而 使得关键字值小的记录向上“飘”(左移),关键字值大的记录向下“沉”(右移)。 每经过一趟冒泡排序,都使无序区中关键字值大的记录进入有序区,对于由 n 个记录组 成的记录序列,多经过 n-1 趟冒泡排序,就可以将这 n 个记录重新按关键字顺序排列。
  • 代码模板
    对由 n 个记录组成的记录序列,多经过(n-1)趟冒泡排序,就可以使记录序列成为 有序序列,第一趟定位第 n 个记录,此时有序区只有一个记录;第二趟定位第 n-1 个记 录,此时有序区有两个记录;以此类推,直到后所有的记录都进入有序区,排序结束。 完整的冒泡排序算法如下。
void  BubbleSort1(int r[], int n)
 {  
     int i,j;  
     int temp;    
     for (i=n-1;i>0;i--)                /*i为每趟排序的数组大下标值*/     
        for (j=0;j<=i-1;j++)            /*一趟交换排序*/ 
             if(r[j].Key>r[j+1].Key)      /*若逆序*/         
              {
                  temp=r[j];
                  r[j]=r[j+1];
                  r[j+1]=temp;
               }
  } 
  • 代码优化
    已知有 10 个待排序的记录,它们的关键字序列为{43,12,35,18,26,57,7, 21,43,46},给出冒泡排序法进行排序的过程。(两个相同的关键字 43,后面 43 用 方框框上)
    分析 解:冒泡排序的过程如图所示。其中括号内表示有序区。
    在这里插入图片描述
    在冒泡排序过程中,一旦发现某一趟没有进行交换操作,就表明此时待排序记录序列 已经成为有序序列,冒泡排序再进行下去已经没有必要,应立即结束排序过程。 在上题中,在第六趟排序后,序列已经成为有序序列,从第七次到第九次排序就没有 必要。为实现这一方法我们在循环体内设一个查看是否有记录交换的变量,在每趟比较时 查看是否有交换,如果没有,则提前结束循环。
void BubbleSort(int line[], int n)
{//优化冒泡算法
	int i, j=n-1;        //前指针与后指针(后指针之后为已排序序列)
	int exchange=0;        //标识每一趟下来是否有交换(优化部分)
	int temp;          
	while (j != 0)
	{//后指针未到达下标0处
		i = 1;                //更新前指针进行新一轮排序
		exchange = 0;         //下一趟标识更新
		for (;i <= j;i++)
		{
			if (line[i - 1] > line[i])
			{//出现逆序
				temp = line[i - 1];
				line[i - 1] = line[i];
				line[i] = temp;
				exchange = 1;      //有交换
			}
		}
		if (exchange == 0)        //此趟无元素交换,前方序列以为有序序列
			return;
		j--;                  //后方有序序列长度+1
	}
}

猜你喜欢

转载自blog.csdn.net/qq_40432881/article/details/83002278