冒泡、选择、插入、归并、快速、希尔、堆排序,都是基于比较的排序,平均时间复杂度最低是O(nlogn)。 计数排序、桶排序、基数排序,都不是基于比较的排序,它们是典型的用空间换时间,在某些时候,平均时间复杂度可以比O(nlogn)更低。 计数排序(Counting Sort)于1954年由Harold H. Seward提出,适合对一定范围内的整数进行排序。 计数排序的核心思想:统计每个整数在数组中出现的次数,进而推导出每个整数在有序数组中的索引。 具体实现步骤如下: 这个实现存在以下问题: 假设array中的最小值为min,最大值为max: 比如元素8在有序数组中的索引为countsArray[8–3]–1,结果为7。 倒数第1个元素7在有序序列中的索引countsArray[7-3]–1,结果为6。 倒数第2个元素7在有序序列中的索引countsArray[7–3]–2,结果为5。 计数排序的最好、最坏、平均时间复杂度为O(n+k),空间复杂度为O(n+k)(其中k是整数的取值范围),属于稳定排序。 更多精彩内容关注本人公众号:架构师升级之路
计数排序
最简单的实现
代码实现如下:// 找出最大值 int max = array[0]; for (int i = 1; i < array.length; i++) { if (array[i] > max) { max = array[i]; } } // 开辟一个数组,用于存放每个元素出现的次数 int[] countsArray = new int[max + 1]; // 统计每个元素出现的次数 for (int i = 0; i < array.length; i++) { countsArray[array[i]]++; } // 排序 int cur = 0; for (int i = 0; i < countsArray.length; i++) { while (countsArray[i]-- > 0) { array[cur++] = i; } }
计数排序优化
代码实现如下:// 找出最大值 int max = array[0]; // 找出最小值 int min = array[0]; for (int i = 1; i < array.length; i++) { if (array[i] > max) { max = array[i]; } if (array[i] < min) { min = array[i]; } } // 开辟一个数组,用于存放每个元素出现的次数 int[] countsArray = new int[max - min + 1]; // 统计每个元素出现的次数 for (int i = 0; i < array.length; i++) { countsArray[array[i]]++; } // 每个次数叠加前面的次数 for (int i = 1; i < countsArray.length; i++) { countsArray[i] += countsArray[i - 1]; } // 开辟一个新数据用来存放有序数组 int[] newArray = new int[array.length]; for (int i = array.length; i >= 0; i++) { newArray[--countsArray[array[i] - min]] = array[i]; } // 将新数组数据覆盖旧数组 for (int i = 0; i < newArray.length; i++) { array[i] = newArray[i]; }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算