目录

介绍:

我的程序:


介绍:

c++的排序方法非常多,比如啥冒泡啊、选择啊、插入啊......,有时候编游戏也用到排序,但我是一个很勤(lan)快(duo)的人,想用冒泡什么的忒麻烦了,复杂度又高。

可能就有人提到了:

博主,用sort呀。

但是,我们老师一向是提倡:

程序自己写的精神......


没有关系

我们有超级宇宙无敌简单的桶排序!是的没错,他的时间复杂度只有O(n)!

但我很为新手着想,程序很简洁。

我们先看看别的博主的:

1:

#include <bits/stdc++.h>
using namespace std;// 打印数组
void print_array(int *arr, int n) {if(n==0){printf("ERROR: Array length is ZERO\n");return;}printf("%d", arr[0]);for (int i=1; i<n; i++) printf(" %d", arr[i]);printf("\n");
}int* sort_array(int *arr, int n) {int i;int maxValue = arr[0];for (i = 1; i < n; i++) if (arr[i] > maxValue)  // 输入数据的最大值maxValue = arr[i]; // 设置10个桶,依次0,1,,,9const int bucketCnt = 10;vector<int> buckets[bucketCnt];// 桶的大小bucketSize根据数组最大值确定:比如最大值99, 桶大小10// 最大值999,桶大小100// 根据最高位数字映射到相应的桶,映射函数为 arr[i]/bucketSizeint bucketSize = 1;while (maxValue) {       //求最大尺寸 maxValue /= 10;bucketSize *= 10;}bucketSize /= 10;       //桶的个数 // 入桶for (int i=0; i<n; i++) {int idx = arr[i]/bucketSize;            //放入对应的桶 buckets[idx].push_back(arr[i]);// 对该桶使用插入排序(因为数据过少,插入排序即可),维持该桶的有序性for (int j=int(buckets[idx].size())-1; j>0; j--) {if (buckets[idx][j]<buckets[idx][j-1]) {swap(buckets[idx][j], buckets[idx][j-1]);}}}// 顺序访问桶,得到有序数组for (int i=0, k=0; i<bucketCnt; i++) {for (int j=0; j<int(buckets[i].size()); j++) {arr[k++] = buckets[i][j];}}return arr;
}int main() {int n;scanf("%d", &n);int *arr;arr = (int*)malloc(sizeof(int)*n);for (int i=0; i<n; i++) scanf("%d", &arr[i]);arr = sort_array(arr, n);print_array(arr, n);return 0;
}

2:

#define _CRT_SECURE_NO_WARNINGS#include <malloc.h>
#include <stdio.h>typedef struct ListNode {int              data;struct ListNode* next;
} LN;// 输出线性表
void displayL(LN* L) {LN* p = L;                  // p 指向首结点while (p != NULL) {         // 不为空,依次遍历printf("%d ", p->data); // 打印p = p->next;            // p 移向下一个节点}printf("\n");
}// 输出数组
void displayA(int* nums, int numsSize) {for (int i = 0; i < numsSize; i++) {printf("%d ", nums[i]);}printf("\n");
}/**************************************************************************** @date    2020/12/03* @brief   合并链表* @param   head    头指针* @param   list    顺序数据链表***************************************************************************/
LN* Merge(LN* head, LN* list) {LN* last   = head;last->next = list->next;while (last->next) {last = last->next;}return last;
}/**************************************************************************** @date    2020/12/03* @brief   顺序插入节点* @param   list    代表第几个桶的链表* @param   value   数据***************************************************************************/
void insert(LN* list, int value) {LN* prev = list;LN* curr = list->next;LN* node = (LN*)malloc(sizeof(LN));node->data = value;node->next = NULL;if (curr == NULL) {prev->next = node;} else {while (curr != NULL && curr->data < value) {prev = curr;curr = curr->next;}prev->next = node;node->next = curr;}
}/**************************************************************************** @date    2020/12/03* @brief   桶排序主程序* @param   array   数组* @param   size    数组大小* @param   num     几个桶***************************************************************************/
void BucketSort(int array[], int size, int num) {// 申请内存,二级指针,初始化,可以理解头指针没数据,从下一个开始存数数据LN** buckets = (LN**)malloc(sizeof(LN*) * num);for (int i = 0; i < num; i++) {*(buckets + i)         = (LN*)malloc(sizeof(LN));(*(buckets + i))->next = NULL;}// 1. 找到最大值和最小值求间隔(桶的大小)int max = array[0];int min = array[0];for (int i = 0; i < size; i++) {if (array[i] > max) {max = array[i];}if (array[i] < min) {min = array[i];}}int space = ((max - min) / num) + 1;// 2. 一个一个分桶排序for (int i = 0; i < size; i++) {int n = (array[i] - min) / space;insert(*(buckets + n), array[i]);}for (int i = 0; i < num; i++) {printf("第 %d 个桶数据: ", i);displayL((*(buckets + i))->next);}// // 3. 合并链表// LN* head   = (LN*)malloc(sizeof(LN));// head->next = NULL;// LN* last   = Merge(head, *(buckets + 0));// for (int i = 1; i < num; i++) {//     if ((*(buckets + i))->next) {//         last = Merge(last, *(buckets + i));//     }// }// head = head->next;// // 4. 把链表值返回数组// for (int i = 0; i < size; i++) {//     array[i] = head->data;//     head     = head->next;// }// 3+4. 当然也可以不合并链表,直接把数据返回数组int index = 0;for (int i = 0; i < num; i++) {if ((*(buckets + i))->next != NULL) {LN* temp = (*(buckets + i))->next;while (temp != NULL) {array[index++] = temp->data;temp           = temp->next;}}}
}int main() {int array[]   = {49, 65, 97, 76, 13, 49, 10, 8, 21};int size      = sizeof(array) / sizeof(int);int BUCKETNUM = 5;// 打印原始数据printf("%d \n", size);displayA(array, size);BucketSort(array, size, BUCKETNUM);displayA(array, size);return 0;
}

大家看灰常的复杂,不太适合新手。

我的程序:


桶排序原理很简单,我们先开一个数组,这里我们用STL库里的map,这样就不怕越界了。

(map需要#inlcude<map>库)

map<int,int> tong;//防止数组过大这里我们使用STl里的map 

然后我们把要排序的数的下表都给记录起来,比如说我要把{3,2,4,1}这个数组从小到大排序,

tong[3]++就代表数组里有一个3,然后是tong[2]++,tong[4]++......最后我们从小到大把桶遍历一边就行啦,如果tong[i]不为0那么输出下标。


OK,开始实践。

#include<iostream>
#include<map>//map需要的库
using namespace std;
int n;
map<int,int> tong;//防止数组过大这里我们使用STl里的map
int main(){cin>>n;//输入要排序的数的个数int maxindex=-1,minindex=2000000000;for(int i=0;i<n;i++){int temp;cin>>temp;//输入要排序的数tong[temp]++;//tong[下标]++,记录个数if(temp<minindex)//记录开始下标 minindex=temp;if(temp>maxindex)//记录末尾下标maxindex=temp;}for(int i=minindex;i<=maxindex;i++){if(tong[i]!=0)for(int j=0;j<tong[i];j++)cout<<i<<" ";//输出}return 0;
}

就很简单。


好了,今天的文章就到这了,先上网课去了,再见玛卡巴卡~


写文不易,关注必回

宇宙最简单排序:桶排序相关推荐

  1. 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...

  2. 算法知识点-排序-桶排序

    Notes:在面试过程中,除非明显声明,一般时间复杂度都是基于比较的排序. 桶排序 桶排序是一种排序的思想,它指的是不基于比较的排序,而是利用桶来完成排序的工作,之前介绍的冒泡,选择,插入,快排,堆排 ...

  3. java排序——桶排序

    2019独角兽企业重金招聘Python工程师标准>>> package jxau.blueDot.lyx;import java.util.ArrayList; import jav ...

  4. 记数排序 桶排序 基数排序

    为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...

  5. 史上最简单的排序-桶排序

    原谅我很久都没发作品,主要是本羊羔遇到了点棘手的问题-- 话不多说,进入正题: 目录 题目 精讲桶排概念 实际生活->举例 计算机语言->举例 代码和题目 题目 我们需要给n个自然数排序( ...

  6. 理论基础 —— 排序 —— 桶排序

    [概述] 桶排序是一种稳定的排序方法,其是非比较类排序中最简单的一种. 其基本思想是:假设待排序记录的值都在 0~m-1 之间,设置 m 个桶,将值为 i 的记录分配到第 i 个桶中,然后再将各个桶中 ...

  7. 比快排更快的排序 ——桶排序

    桶排序利用了"空间换时间的思想"和标记的技巧 原题 1.https://www.luogu.org/problemnew/show/P1059 2.https://www.luog ...

  8. php桶排序,PHP实现桶排序算法

    本篇讲解PHP实现桶排序算法. 简单意义上的桶排序: 桶排序的原理是先安排N+1个桶作为容器,若数据范围为N的话. 然后将测试数据(所需排序的数据)进行循环,放入对应的桶内.数据一定是在范围N内的. ...

  9. 排序算法之计数排序、基数排序和桶排序

    转自:http://www.cnblogs.com/ttltry-air/archive/2012/08/04/2623302.html 计数排序,基数排序,桶排序等非比较排序算法,平均时间复杂度都是 ...

最新文章

  1. 关于人脸识别滥用的十个可能的应对方案
  2. python将txt转换为csv_Python Pandas 三行代码将 txt 文件转换成 csv 文件
  3. 计算机联锁站按钮继电器电路,计算机联锁系统与站内各种电路结合说明.DOC
  4. MATLAB基本语法 初学者
  5. 微软发布架构师期刊阅读器
  6. SPI接口比IIC速度快的理解
  7. yii2 migrate 数据库迁移的简单分享
  8. Linux Ubuntu16.04界面美化
  9. 交通运输部:预计五一假期全国客运量2.65亿人次
  10. 智慧消防、消防管理、事件管理、维保巡检、应急管理、培训管理、值班管理、考试管理、设备列表、机构管理、应急预案、axure原型、rp原型
  11. 页面载入时在导航栏显示背景图片
  12. spark 算子实例
  13. python while快速写法_从零开始学Python,带你手把手实战之一
  14. 推荐参考文献元数据挖掘的几篇论文
  15. 【Excel实战】按指定字符拆分字符串
  16. Android 6.0 sensor 框架详解 (application层)
  17. 计算机术语中 1gb等于 mb.,GB、MB、KB分别是什么意思,大小分别是多少?
  18. 分数的表示、化简以及输出
  19. 国外著名java论坛
  20. C 中用语言描述出下述方法的功能,2015年10月自考《大学语文》模拟试题及答案4...

热门文章

  1. WHO IS MVP ?——线程
  2. 并联四足机器人项目开源教程(三)--- 使用webots搭建仿真环境
  3. JS---event事件
  4. 主定理(Master theorem)与Akra–Bazzi定理
  5. 以数据驱动的支付场景数字营销,能否成为下一个...
  6. 数据双向绑定的原生写法原理
  7. python文件管理_python——文件管理
  8. 如何租用mt4虚拟服务器,mt4服务器出租
  9. 21世纪7大数学难题,解决其中一个你就成为了百万富翁!
  10. 如何修改别人的GHO作品