C++经典排序算法的理解:冒泡排序和选择排序

引言:自己在学习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; }
原文地址:https://www.cnblogs.com/honor260/p/14040208.html