数据结构与算法--基础排序之桶排序

目录

实现思路

代码实现

时间复杂度


实现思路

桶排序同样是一种线性时间的排序算法

桶排序需要创建若干个桶来协助排序

每一个桶(bucket)代表一个区间范围,里面可以承载一个或多个元素

桶排序的第1步,就是创建这些桶,并确定每一个桶的区间范围具体需要建立多少个桶,如何确定桶的区间范围,有很多种不同的方式。我们这里创建的桶数量等于原始数列的元素数量,除最后一个桶只包含数列最大值外, 前面各个桶的区间按照比例来确定。

区间跨度 = (最大值-最小值)/ (桶的数量 - 1)

假设有一个非整数数列如下:4.5,0.84,3.25,2.18,0.5

第2步,遍历原始数列,把元素对号入座放入各个桶中。

 第3步,对每个桶内部的元素分别进行排序(显然,只有第1个桶需要排序) 

 4步,遍历所有的桶,输出所有元素

代码实现

public class BucketSort {

    public static double[] bucketSort(double[] array){

        double max = 0;
        double min = 0;

        //获得最大值和最小值之间的差
        for (int i = 0; i < array.length; i++) {

            if (array[i] > max){
                max = array[i];
            }

            if (array[i] < min){
                min = array[i];
            }
        }
        double d = max - min;

        //桶初始化
        int bucketNum = array.length;
        ArrayList<LinkedList<Double>> bucketList = new ArrayList<LinkedList<Double>>(bucketNum);

        for (int i = 0; i < bucketNum; i++) {
            bucketList.add(new LinkedList<Double>());
        }

        //将每个元素放入桶中
        for (int i = 0; i < array.length; i++) {
            int num = (int)((array[i] - min) * (bucketNum - 1) / d);
            bucketList.get(num).add(array[i]);
        }

        //对每个桶内部进行排序
        for (int i = 0; i < bucketList.size(); i++){
            Collections.sort(bucketList.get(i));
        }

        double[] sortArray = new double[array.length];

        //输出全部元素
        int index = 0;
        for (LinkedList<Double> list : bucketList) {
            for (double element : list) {
                sortArray[index] = element;
                index++;
            }
        }
        return sortArray;
    }
}

时间复杂度

 时间复杂度:O(n)

### 数据结构算法中的查找和排序 #### 查找算法概述 查找是指在一个数据集合中寻找特定元素的过程。常见的查找算法包括顺序查找、二分查找(也称为折半查找)、哈希查找等。对于不同的应用场景,选择合适的查找方式至关重要。 - **顺序查找**适用于无序列表,在最坏情况下需要遍历整个列表才能找到目标项。 - **二分查找**则针对有序数组实现高效的搜索操作,通过不断缩小范围来定位目标位置[^2]。 ```python def binary_search(arr, target): low, high = 0, len(arr) - 1 while low <= high: mid = (low + high) // 2 if arr[mid] == target: return mid elif arr[mid] < target: low = mid + 1 else: high = mid - 1 return -1 ``` #### 排序算法分类及其特点 排序是对一组对象按照某种规则重新排列的过程。根据是否依赖于比较运算符可分为两大类: - **基于比较的排序**:如冒泡排序、插入排序、希尔排序、快速排序以及堆排序等;这类方法的时间复杂度通常不低于 O(n log n),其中 n 表示待处理的数据量。 - **非基于比较的排序**:例如计数排序、基数排序桶排序,这些技术利用了数值本身的特性来进行排序,可以在某些特殊条件下达到线性时间性能O(n)。 ##### 堆排序简介 堆是一种特殊的完全二叉树结构,可以分为最大堆和最小堆两种形式。在构建好初始的最大(小)堆之后,可以通过反复取出根节点并重建堆的方式完成升序或降序排列的任务。具体来说,堆排序主要涉及两个核心步骤:建堆过程和调整过程[^3]。 ```c++ void heapify(int arr[], int n, int i){ int largest = i; int l = 2*i + 1; int r = 2*i + 2; if(l<n && arr[l]>arr[largest]) largest=l; if(r<n && arr[r]>arr[largest]) largest=r; if(largest!=i){ swap(&arr[i],&arr[largest]); heapify(arr,n,largest); } } void heapsort(int arr[],int n){ for(int i=n/2-1;i>=0;i--) heapify(arr,n,i); for(int i=n-1;i>0;i--){ swap(&arr[0],&arr[i]); heapify(arr,i,0); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值