IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C语言:桶排序(BucketSort) -> 正文阅读

[数据结构与算法]C语言:桶排序(BucketSort)

题目:

排序一组数字:9 5 9 2 8 9 2 1 0 1 0 5 4

这还不简单?一个冒泡排序,或者一个快速排序,结束!好的,一个时间复杂度是O(n^2),一个时间复杂度是O (nlogn)。对于平时的小打小闹,这两种方法绝对没有问题。但作为未来码农精英的我们肯定要追求完美啦!所以,我们用O(n)复杂度来排序他!

桶排序

桶排序是所有排序中最简单的排序之一,之所以他的复杂度能达到O(n),是因为他们都是非基于比较的排序算法,不涉与元素之间的比较操作。

对于上面的这道题目的步骤如下:

1. 遍历原数组,找出原数组的最大值。

2. 根据找出的最大值,建立一个最大下标与这个最大值相同的新数组(桶数组)。原数组的最大值 为9,那么桶数组的最大下标为9(a[0]~a[9]),所以我们创建一个大小为10的桶数组。

3. 再次遍历原数组,每遍历一个元素,桶数组中下标与之相等的元素自增。

原数组:9 5 9 2 8 9 2 1 0 1 0 5 4

4. 遍历桶数组,按照每个元素大小一个一个打印出来。

但这样的桶排序有很大的缺陷:

1. 桶排序的算法不能够操作浮点值或者负数。(负数的情况我们可以用一个方法来避免:先将原数组中的每一个元素减去元素组中最小的负数,然后排完序后每一个元素再增加原来减去的负数就行了)。

2. 如果原数组的取值间隔过大,如原数组为2 3 4 5 6 7 90 91 92,那我们想要创建一个大小为93的数组,这样会引起不必要的空间浪费。

#include<stdio.h>
#include<stdlib.h>
#define Max_len 10      //数组元素个数
 
// 打印结果
void Show(int  arr[], int n)
{
    int i;
    for ( i=0; i<n; i++ ){
        printf("%d\t", arr[i]);
	}
    printf("\n");
}
 
//获得未排序数组中最大的一个元素值
int GetMaxVal(int* arr, int len)
{
    int maxVal = arr[0]; //假设最大为arr[0]
    for(int i = 1; i < len; i++)  //遍历比较,找到大的就赋值给maxVal
    {
        if(arr[i] > maxVal)
            maxVal = arr[i];
    }
    return maxVal;  //返回最大值
}
 
//桶排序   参数:数组及其长度
void BucketSort(int* arr , int len)
{
    int tmpArrLen = GetMaxVal(arr , len) + 1;
    int tmpArr[tmpArrLen];  //获得空桶大小
    int i, j;
    
    for( i = 0; i < tmpArrLen; i++)  //空桶初始化
        tmpArr[i] = 0;
    
    for(i = 0; i < len; i++)   //寻访序列,并且把项目一个一个放到对应的桶子去。
        tmpArr[ arr[i] ]++;
    
    for(i = 0, j = 0; i < tmpArrLen; i ++)
    {
        while( tmpArr[ i ] != 0) //对每个不是空的桶子进行排序。
        {
            arr[j ] = i;  //从不是空的桶子里把项目再放回原来的序列中。
            j++;
            tmpArr[i]--;
        }
    }
}
 
int main()
{   //测试数据
    int arr_test[Max_len] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 };
    //排序前数组序列
    Show( arr_test, Max_len );
    //排序
    BucketSort( arr_test,  Max_len);
    //排序后数组序列
    Show( arr_test, Max_len );
    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:43:26  更:2022-09-13 11:44:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 17:54:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码