使用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