C/C++ 数组排序

前言

笔者在逛GitHub的时候,偶遇一开源项目,其程序可演示多种数组排序算法,于是便对排序算法有一些感兴趣。
GitHub地址:https://github.com/bingmann/sound-of-sorting
演示视频:https://www.bilibili.com/video/av685670/

为什么要将进行排序?

软件中对用户操作习惯的统计,网站中对各种用户数据的排行,这些数据往往是接近随机的,为了方便利用这些数据,所以我们需要将这些数据进行排序。

如何将数据进行排序?

将数组排序的方法有非常多,但大部分是大同小异,但经典的排序算法有9种,它们各有利弊,根据数组大小和数组中数据的某些性质选择适当的排序算法。至于这些排序算法的代码网上已经详尽,笔者就不在这里累赘了。

一个简单的排序算法

笔者这两天因使用了Visual Studio而接触了一点点C++,于是便使用C++根据自己的思路简单的实现了一个排序算法,此算法类似鸡尾酒排序算法,但却不是,有可能时笔者独创的算法吧。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define SIZE 500                                    //数组中元素的数量

void swap(int *p1, int *p2)                         //交换数组中的两元素
{
    int temp = *p1;                                 //创建变量储存元素p1的指针
    *p1 = *p2;                                      //将元素p1的指针改为元素p2的指针
    *p2 = temp;                                     //将元素p2的指针改为之前存储的元素p1的指针
}


int main() {                                        //程序从这里开始运行
    int array[SIZE];                                //创建一个数组
    printf("未排序数组:\n\n");
    for (int i = 0; i < SIZE; i++) {                //遍历数组中所有元素
        array[i] = rand();                          //数组中每个元素赋值为一个随机数
        printf("%d  ", array[i]);                   //输出还未排序的数组中所有元素
    }
    printf("\n\n 按下任意键开始排序");
    getchar();                                      //等待用户响应
    system("cls");                                  //清除所有输出结果

    int l = -1, u = SIZE - 1;                       //定义我们需要寻找最值并排序的初始区间[0,SIZE]为全集
    for (l++; l < u; u--) {                         //遍历已排序区间[0,l]∪[u,SIZE]的补集(即遍历未排序区间)
                                                    //当l >= u时,区间(l,u)为空集,跳出循环
        int max = 0, min = 0;                       //创建用于存储最大值下标和最小值下标的变量
        for (int i = l; i <= u; i++) {              //遍历数组在未排序区间中的所有元素
            min = array[min] > array[i] ? i : min;  //寻找数组在未排序区间中最小值的下标
            max = array[max] < array[i] ? i : max;  //寻找数组在未排序区间中最大值的下标
        }
        swap(&array[l], &array[min]);               //交换数组在未排序区间中的最小值与数组在未排序区间左端点的值
        swap(&array[u], &array[max]);               //交换数组在未排序区间中的最大值与数组在未排序区间右端点的值

        printf("数组正在排序:\n\n");
        for (int i = 0; i < SIZE; i++) {
            printf("%d  ", array[i]);
        }
        system("cls");                              //清除所有输出结果
    }

    printf("排序后数组:\n\n");
    for (int i = 0; i < SIZE; i++) {                //遍历排序完后数组中所有元素
        printf("%d  ", array[i]);                   //输出排序后的数组中所有元素
    }

    getchar();                                      //等待用户响应(防止程序自动退出)
    return 0;
}

程序运行效果:

此排序算法的基本思路其实就是不断缩小一个寻找最小值和最大值的区间,将最小值和最大值与此区间最右端和最左端的元素交换位置,直到这个区间为空,那么就全部排序完成了。因代码中注释已经足够详细,这里就不累赘了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容