C语言:冒泡法排序及其通用实现

目录

引言:

一、冒泡排序的基本原理

算法步骤

二、C语言实现

代码解释:

三、优化冒泡排序的效率

优化1:标志位

例如:对初始数组:[4, 2, 5, 3, 7, 8]

优化2:鸡尾酒排序

例如:对初始数组:[5, 1, 4, 2, 8, 0, 3]

四、冒泡排序的通用实现

qsort 函数概述

代码解释:

五、总结


引言:

        冒泡排序(Bubble Sort)是计算机科学领域中最简单的排序算法之一,广泛应用于学术教学和初学者编程实践。它之所以得名“冒泡”,是因为数据交换的过程类似于水中气泡的上升,较小或较大的元素经过一系列交换后“浮”到数组的顶端。尽管在实际应用中由于其较低的效率并不常用,冒泡排序仍是理解和学习其他复杂排序算法的基础。本文将详细介绍C语言实现的冒泡排序算法及其扩展。

一、冒泡排序的基本原理

        冒泡排序的核心思想是通过重复遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素,这表示数列已经排序完成。

算法步骤

  1. 比较相邻的两个元素,如果前者比后者大,则交换它们的位置。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有元素重复以上的步骤,除了最后已经排序好的元素。
  4. 重复步骤1~3,直到排序完成。

二、C语言实现

根据其原理我们很快能写出一个可以对整形数列排序的程序,如下:

#include 

void bubbleSort(int arr[], int sz) 
{
    int i, j, temp;
    for (i = 0; i < sz-1; i++) 
    {     
        // 最后 i 个已经排序好了
        for (j = 0; j < sz-i-1; j++) 
        {
            if (arr[j] > arr[j+1]) 
            {
                // 交换两个元素
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

int main() 
{
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int sz = sizeof(arr)/sizeof(arr[0]);
    bubbleSort(arr, sz);
    printf("排序后的数组: \n");
    for (int i = 0; i < sz; i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

代码解释:

  • bubbleSort 函数接受一个整数数组 arr 和该数组的长度 n 作为参数。
  • 外层循环负责遍历整个数组,内层循环负责进行实际的比较和交换操作。
  • 如果一对相邻的元素顺序错误(即,arr[j] > arr[j+1]),我们就交换它们的位置。
  • 每完成一次外层循环,就有一个元素被放置在其最终位置,这就是为什么内层循环可以逐渐减少遍历的元素数量。

三、优化冒泡排序的效率

        虽然冒泡排序不是很高效,但我们仍然可以对其进行一些优化,以减少排序过程中的比较和交换次数。

优化1:标志位

void BubbleSort-2(int arr[], int sz) {
    int i, j, temp;
    int swapped;
    for (i = 0; i < sz - 1; i++) {
        swapped = 0;
        for (j = 0; j < sz - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = 1;
            }
        }
        // 如果在这一轮排序中没有发生交换,则说明数组已经有序,可以结束排序
        if (swapped == 0)
            break;
    }

        通过设置一个标志位swapped,如果在某一轮排序结束后没有任何元素交换位置,那么可以提前结束排序,因为剩余的元素已经是有序的了。

例如:对初始数组:[4, 2, 5, 3, 7, 8]

你可能感兴趣的:(C语言,c语言,算法,排序算法)