题解 | #C++冒泡排序#
C++冒泡排序
https://www.nowcoder.com/practice/eb72dada09de43ceacf93f9a143ee321
#include <iostream>
using namespace std;
int main()
{
int arr[6] = { 0 };
int len = sizeof(arr) / sizeof(int);
for (int i = 0; i < len; i++)
{
cin >> arr[i];
}
// write your code here......
// for (int i = 1; i < len; ++i)
// {
// for (int j = 0; j < len - i; ++j)
// {
// if (arr[j] > arr[j + 1])
// {
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// }
// this is very interesting
// for (int i = len - 1; i > 0; --i)
// {
// for (int j = 0; j < i; ++j)
// {
// if (arr[j] > arr[j + 1])
// {
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// }
// int swapFlag = 0;
// for (int i = len - 1; i > 0; --i)
// {
// for (int j = 0; j < i; ++j)
// {
// if (arr[j] > arr[j + 1])
// {
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// swapFlag = 1;
// }
// }
// if (!swapFlag)
// {
// break;
// }
// }
int swapFlag = 0;
int indexFinal = len - 1;
int indexFinalTmp;
for (int i = len - 1; i > 0; --i)
{
for (int j = 0; j < indexFinal; ++j)
{
if (arr[j] > arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
swapFlag = 1;
indexFinalTmp = j;
}
}
if (!swapFlag)
{
break;
}
indexFinal = indexFinalTmp;
}
for (int i = 0; i < len; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
关于冒泡排序,其实就是相当于,每次选出一个最值,然后不断的缩小需要排序的个数(即每次减去一个,继续排剩下的)。
关于其优化,即在某一次中,如果每次都没有发生交换的话,即说明,整个都有序了,不用再继续只是缩小一个元素,继续的循环下去了,而可以直接跳出循环,完成排序。
第二点优化处,依然是在于可以缩小一下排序的范围,有的可能后面已经是有序的了,不需要继续就是了,观察一下,一次冒泡结束后的最后产生交换的位置,那个就是下次冒泡的结尾。这样可以减少一下相应的冒泡次数。
