引言:自己在学习C++的过程中,对于非常经典的两种排序算法有时候会突然卡住,可能是因为一起学的,所以用起来老是会记混,脑袋中会有奇妙的记忆组合,比如:选择排序是不是得安排辅助变量的那个?选择排序的内层循环边界n是不是得减来着,后来发现这些问题的原因可能是没有理解这两种排序算法的实质,不管名字如何,他们终究是辅助我们理解记忆的,如果强行按照名字而理解的话,那反而是舍本逐末了,所以今天就把这两种算法按照自己的理解和记忆写下来,方便日后回忆梳理。
#include<iostream> using namespace std; int main() { int n = 0; cout << "请输入需要排序数组的大小" << endl; cin >> n; int* a = new int[n]; cout << "请输入需要排序的数组" << endl; for (int i = 0; i < n; i++) { cin >> a[i]; } cout << "选择排序如下:" << endl; //选择排序算法:在指定的位置上选择一个足够小的数,选完后继续往下进行。外圈固定
//选择排序的特点是外圈i和内圈j相比较,为外圈的i挑选一个合适的数。 for (int i = 0; i < n; i++) //降序 { for (int j = i + 1; j < n; j++) { if (a[i] < a[j]) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } } } for (int i = 0; i < n; i++) cout << a[i] << " "; cout << "冒泡排序的结果如下" << endl; //冒泡排序,通过把前面小的(大的)往后挪,达到冒泡的效果,内圈移动
//因为是相邻顶点两个比较,完了后再比较后面的相邻两个量,所以一组数都可以比较一遍,因而也就可以配合一个标志量来反映比较的结果是否符合排序期望,符合的话就直接跳出循环。
//冒泡排序重在内圈循环中前后两个元素的比较,把内圈一次循环中的最值移到端点处
for (int i = 1; i < n; i++) //升序 { int h = 1; for (int j = 0; j < n-i; j++) { if (a[j] > a[j +1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; h = 0;//辅助变量 } } if (h) { break; } } for (int i = 0; i < n; i++) cout << a[i] << " "; return 0; }