使用C++实现冒泡排序

来源:互联网 发布:apache jmeter 2.13 编辑:程序博客网 时间:2024/06/02 06:36

使用C++实现冒泡排序



基础版本的冒泡排序

int lastNotSwapped = arrSize-1;for (int pass = 1; pass <= arrSize-1; pass++){    for (int j = 0; j < lastNotSwapped; j++)    {        if (arr[j] > arr[j + 1])        {            swap(arr[j], arr[j + 1]);        }    }    lastNotSwapped -= 1;}

 int lastNotSwapped = arrSize-1;

此句定义了最后一个未排序的元素为数组最后一个元素。

for (int pass = 1; pass <= arrSize-1; pass++)

外层循环,共进行arrSize-1轮排序

for (int j = 0; j < lastNotSwapped; j++)    {        if (arr[j] > arr[j + 1])        {            swap(arr[j], arr[j + 1]);        }    }lastNotSwapped -= 1;

内层循环,经过一轮排序,最后一个数变为已排序,其前一个数变为未排序


加强版本的冒泡排序

    int lastNotSwapped = arrSize-1;    int tempLastNotSwapped = arrSize - 1;    bool swapped = false;    do    {        swapped = false;        int temp(0);        lastNotSwapped = tempLastNotSwapped;        for (int j = 0; j < lastNotSwapped; j++)        {            if (arr[j] > arr[j + 1])            {                swap(arr[j], arr[j + 1]);                swapped = true;                tempLastNotSwapped=j;            }        }    } while (swapped);

    int lastNotSwapped = arrSize-1;    int tempLastNotSwapped = arrSize - 1;    bool swapped = false;

默认未排序。

    do    {        swapped = false;        int temp(0);        lastNotSwapped = tempLastNotSwapped;        for (int j = 0; j < lastNotSwapped; j++)        {            if (arr[j] > arr[j + 1])            {                swap(arr[j], arr[j + 1]);                swapped = true;                tempLastNotSwapped=j;            }        }    } while (swapped);
  • 内层循环不必解释,还仍是不断比较前后大小直到最后一个未排序元素
  • 值得一说的是temp的作用——在内循环时若进行交换,则将temp暂时定义为进行交换时的i,若之后还有交换则继续更改。一轮排序结束后temp的值就是最后一个未排序元素,此时再将其赋给lastNotSwapped。
  • 若一轮排序未发生交换,则跳出外层循环,此时Swapped为假


可视化的排序过程,详见https://visualgo.net/en/sorting

1 0