题解 | #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; }
关于冒泡排序,其实就是相当于,每次选出一个最值,然后不断的缩小需要排序的个数(即每次减去一个,继续排剩下的)。
关于其优化,即在某一次中,如果每次都没有发生交换的话,即说明,整个都有序了,不用再继续只是缩小一个元素,继续的循环下去了,而可以直接跳出循环,完成排序。
第二点优化处,依然是在于可以缩小一下排序的范围,有的可能后面已经是有序的了,不需要继续就是了,观察一下,一次冒泡结束后的最后产生交换的位置,那个就是下次冒泡的结尾。这样可以减少一下相应的冒泡次数。