冒泡排序法

整体思想

从数组头部开始,不断比较相邻的两个元素大小,让较大元素逐渐往后移动(交换两个元素的值),知道数组的末尾。每一轮比较可以将一个值移动到合适的位置,因此需要多轮比较才可以实现排序。

以“3 2 4 1”为例,
第一轮 排序过程
3 2 4 1 (最初)
2 3 4 1 (比较3和2,交换)
2 3 4 1 (比较3和4,不交换)
2 3 1 4 (比较4和1,交换)
第一轮结束,最大的数字 4 已经在最后面,因此第二轮排序只需要对前面三个数进行比较。

第二轮 排序过程
2 3 1 4 (第一轮排序结果)
2 3 1 4 (比较2和3,不交换)
2 1 3 4 (比较3和1,交换)
第二轮结束,次大的数字 3 已经排在倒数第二个位置,所以第三轮只需要比较前两个元素。

第三轮 排序过程
2 1 3 4 (第二轮排序结果)
1 2 3 4 (比较2和1,交换,排序结束)

算法实现(升序排序)

#include 

using namespace std;

int main(){
    int nums[10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9};
    int i, j, temp;
    // 冒泡排序算法:进行 n-1 轮比较
    for(i=0; i<10-1; ++i)
    {
        // 此处循环i从0开始,因此要表示个数,需要对i+1
        // 每一轮比较前 n-(i+1) 个,也就是说,已经排序好的最后 i+1 个不用比较
        for(j=0; j<10-(i+1); ++j)
        {
            if(nums[j] > nums[j+1])  // 将 > 改为 < 即为降序排序算法
            {
                temp = nums[j];
                nums[j] = nums[j+1];
                nums[j+1] = temp;
            }
        }
    }
   
    // 输出排序后的数组
    for(i=0; i<10; ++i)
    {
        cout << nums[i] << endl;
    }
   
    return 0;
}

优化算法

思路:添加一个标志,当比较到第 i 轮的时候,如果剩下的元素已经排序好了,那么就不用再继续比较了,跳出循环即可,这样就减少了比较的次数,提高了执行效率。

#include 

using namespace std;

int main()
{
    int nums[10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9};
    int i, j, temp;
    int flag;
    // 冒泡排序算法:进行 n-1 轮比较
    for(i=0; i<10-1; ++i)
    {
	    flag = 1; // 默认剩下元素都已排序
        // 此处循环i从0开始,因此要表示个数,需要对i+1
        // 每一轮比较前 n-(i+1) 个,也就是说,已经排序好的最后 i+1 个不用比较
        for(j=0; j<10-(i+1); ++j)
        {
            if(nums[j] > nums[j+1])  // 将 > 改为 < 即为降序排序算法
            {
           		flag = 0;	// 一旦发生了元素交换,则说明剩下元素没有完成排序
                temp = nums[j];
                nums[j] = nums[j+1];
                nums[j+1] = temp;
            }
        }
        if (flag)
		{
			break;
		}
    }
   
    // 输出排序后的数组
    for(i=0; i<10; ++i)
    {
        cout << nums[i] << endl;
    }
   
    return 0;
}

你可能感兴趣的:(排序算法)