宇宙最简单排序:桶排序
目录
介绍:
我的程序:
介绍:
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;
}
就很简单。
好了,今天的文章就到这了,先上网课去了,再见玛卡巴卡~
写文不易,关注必回
宇宙最简单排序:桶排序相关推荐
- 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序
养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...
- 算法知识点-排序-桶排序
Notes:在面试过程中,除非明显声明,一般时间复杂度都是基于比较的排序. 桶排序 桶排序是一种排序的思想,它指的是不基于比较的排序,而是利用桶来完成排序的工作,之前介绍的冒泡,选择,插入,快排,堆排 ...
- java排序——桶排序
2019独角兽企业重金招聘Python工程师标准>>> package jxau.blueDot.lyx;import java.util.ArrayList; import jav ...
- 记数排序 桶排序 基数排序
为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...
- 史上最简单的排序-桶排序
原谅我很久都没发作品,主要是本羊羔遇到了点棘手的问题-- 话不多说,进入正题: 目录 题目 精讲桶排概念 实际生活->举例 计算机语言->举例 代码和题目 题目 我们需要给n个自然数排序( ...
- 理论基础 —— 排序 —— 桶排序
[概述] 桶排序是一种稳定的排序方法,其是非比较类排序中最简单的一种. 其基本思想是:假设待排序记录的值都在 0~m-1 之间,设置 m 个桶,将值为 i 的记录分配到第 i 个桶中,然后再将各个桶中 ...
- 比快排更快的排序 ——桶排序
桶排序利用了"空间换时间的思想"和标记的技巧 原题 1.https://www.luogu.org/problemnew/show/P1059 2.https://www.luog ...
- php桶排序,PHP实现桶排序算法
本篇讲解PHP实现桶排序算法. 简单意义上的桶排序: 桶排序的原理是先安排N+1个桶作为容器,若数据范围为N的话. 然后将测试数据(所需排序的数据)进行循环,放入对应的桶内.数据一定是在范围N内的. ...
- 排序算法之计数排序、基数排序和桶排序
转自:http://www.cnblogs.com/ttltry-air/archive/2012/08/04/2623302.html 计数排序,基数排序,桶排序等非比较排序算法,平均时间复杂度都是 ...
最新文章
- 关于人脸识别滥用的十个可能的应对方案
- python将txt转换为csv_Python Pandas 三行代码将 txt 文件转换成 csv 文件
- 计算机联锁站按钮继电器电路,计算机联锁系统与站内各种电路结合说明.DOC
- MATLAB基本语法 初学者
- 微软发布架构师期刊阅读器
- SPI接口比IIC速度快的理解
- yii2 migrate 数据库迁移的简单分享
- Linux Ubuntu16.04界面美化
- 交通运输部:预计五一假期全国客运量2.65亿人次
- 智慧消防、消防管理、事件管理、维保巡检、应急管理、培训管理、值班管理、考试管理、设备列表、机构管理、应急预案、axure原型、rp原型
- 页面载入时在导航栏显示背景图片
- spark 算子实例
- python while快速写法_从零开始学Python,带你手把手实战之一
- 推荐参考文献元数据挖掘的几篇论文
- 【Excel实战】按指定字符拆分字符串
- Android 6.0 sensor 框架详解 (application层)
- 计算机术语中 1gb等于 mb.,GB、MB、KB分别是什么意思,大小分别是多少?
- 分数的表示、化简以及输出
- 国外著名java论坛
- C 中用语言描述出下述方法的功能,2015年10月自考《大学语文》模拟试题及答案4...