希尔排序是1959年某个叫希尔的数学大大发明的,它其实就是在插入排序的基础上做了一些优化,但是效率却不知道提高了多少倍,我估计几万倍应该有吧(纯属个人瞎蒙)。插入排序是一个一个来插,而希尔排序则是有一个间隔,比如在容量为10的数组里将索引为1和3和5,7插入排序, 2和5,8插入排序。在这其中有一个增量的概念,可别以为这个增量是随便取的,如果取的不科学,可是效率也会大大的下降哦。最科学的取法就是 n = (n * 3)+1。 n是增量,初始值为1,按照这个公式一直增加到array.length / 3这个位置左右,然后在运算一次这个公式,就是最大的增量了。
package sort;
public class ShellSort {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int n = 1000000;
int[] arr = new int[n];
for (int i = n; i > 0; i--) {
arr[i - 1] = i;
}
shellSort(arr);
/*for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}*/
}
/**我自己写的,效率要低一点。
* @param arr
*/
public static void shellSort(int[] arr){
int len = arr.length;
int h = 1;
while(h <= len/3){
h = (h * 3) +1;
}
while(h > 0){
for (int i = 0; i < len; i++) {
while(i + h < len && arr[i] > arr[i+h]){
int temp = arr[i];
arr[i] = arr[i+h];
arr[i+h] = temp;
}
}
h = (h - 1)/3;
}
}
/**书上例子,效率较高。
* @param arr
*/
public static void shellSort3(int[] arr){
int i,j,n=1,temp,len = arr.length;
//获取最大增量值
while(n<=len/3)
n = n*3+1;
//增量等于1时是最后一次排序
while(n > 0){
for (i = n; i < len; i++) {
temp = arr[i];
j = i;
//按照增量插入排序,由后往前排,这样效率高,我写的由前往后排,做了一些无用功。
while(j >= n && arr[j - n] >= temp){
arr[j] = arr[j - n];
j-=n;
}
arr[j] = temp;
}
//增量递减公式
n = (n - 1)/3;
}
}
}
在我机器上逆序排100w数据耗时44毫秒,快吧,比归并排序快多了,而且不需要额外空间。算法复杂度和代码量也比较优,快速排序复杂了一点(我是说如果写的更可能完美的情况下)代码量也多。虽然比快速排序稍慢一点点,但是综合其他,我感觉是排序的首选。专家也推荐一般情况下用希尔排序,如果你要更快一点点的话,才考虑快速排序。
分享到:
相关推荐
希尔排序是一种基于插入排序的快速高效的排序算法,由Donald Shell于1959年提出。在处理中等规模的数据集时,希尔排序表现得相当出色,尤其是在数据项数量达到几千的时候。虽然其时间复杂度不是最优的O(n*logn),但...
本文将深入探讨C#中常见的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序,以及它们的实现细节和应用场合。 首先,我们来看**冒泡排序**。冒泡排序是一种简单的交换排序方法,它通过不断比较相邻元素并交换...
希尔排序由于其独特的排序方式,尤其适用于大规模数据的排序,虽然在某些情况下可能不如其他高级排序算法(如快速排序、归并排序等)效率高,但在特定条件下,如接近有序的序列,其表现往往优于其他简单排序算法。
总结,希尔排序是介于简单排序与高级排序之间的一种算法,通过合理设计增量序列,可以在一定程度上提升排序速度,适合处理大数据量的排序问题。在实际编程中,根据数据特点选择合适的增量序列是优化希尔排序的关键。
希尔排序的时间复杂度通常比冒泡排序和插入排序要好,但不如更高级的排序算法如快速排序,其平均时间复杂度介于O(n)到O(n^2)之间,具体取决于选择的增量序列。 **快速排序(Quick Sort)** 虽然标题中没有提及,但...
- 由于其简单性,插入排序常用于其他高级排序算法的基础。 4. **折半排序(Binary Insertion Sort)**: - 折半插入排序是插入排序的一个变体,它在插入元素时使用二分查找来确定插入位置,从而减少比较次数。 -...
希尔排序的时间复杂度通常比冒泡排序更快,但不如其他高级排序算法。 6. **直接插入排序**:直接插入排序是将每个元素与已排序的部分进行比较,找到合适位置插入。对于小规模或部分有序的数据,插入排序效率较高,...
这里我们将深入探讨六种基本的排序算法:冒泡排序、插入排序、选择排序、希尔排序、堆排序以及归并排序,这些都是快速排序算法的基础。下面,我们将逐一介绍这些算法的工作原理、效率特点及其应用场景。 1. **冒泡...
### 数据结构之希尔排序 #### 一、希尔排序概述 希尔排序(Shell Sort)是一种基于插入排序的高效算法。它通过将原始数组分为若干个子序列,并对这些子序列进行直接插入排序,来提高排序效率。随着排序过程的进行...
总的来说,希尔排序是一种改进的插入排序,通过增量策略优化了插入排序在处理大规模数据时的效率,适用于需要快速排序但又无法使用更高级排序算法的情况。在实际编程中,希尔排序常常作为其他复杂排序算法的备选方案...
在实际应用中,希尔排序通常用于对中等大小的数据集进行排序,因为对于小数据集,插入排序已经足够高效,而对于大数据集,更高级的排序算法如快速排序或归并排序可能会有更好的表现。希尔排序的优点在于其简单性和可...
该资源提供了一份全面的指南,介绍了如何在Java中实现希尔排序。文档中涵盖了希尔排序的基本概念,包括如何对数组进行排序以及如何在Java中实现希尔排序。此外,文档还包括一个逐步指南,介绍如何在Java中实现希尔...
这里我们将探讨8种在C#中实现的初级和高级排序方法,这些方法在数据结构和算法的学习中至关重要。以下是每种排序方法的详细介绍: 1. **冒泡排序 (Bubble Sort)** 冒泡排序是最简单的排序算法之一,它通过重复遍历...
希尔排序的时间复杂度通常比直接插入排序要好,但不如其他高级排序算法。 3. 快速排序(Quick Sort): 快速排序是一种高效的分治策略排序算法,由C.A.R. Hoare提出。其基本思想是选取一个基准元素,将数组分为两...
希尔排序在处理大量数据时效率较高,但相比其他高级算法如归并排序或快速排序,其复杂度分析并不直观。理解这些排序算法的原理并能灵活运用,可以显著提升程序的运行效率。在C#中,可以使用`Array.Sort()`或`List<T>...
这种方法对小规模数据或接近有序的数据效率较高,但在处理大规模随机数据时,其性能不如其他高级排序算法。 希尔排序,由Donald Shell提出,是一种改进的插入排序。它通过设定一个间隔序列(如初始间隔为n/2)来...
在高级排序中,归并排序、堆排序、希尔排序和快速排序是四种非常重要的算法,它们各自有着独特的原理和应用。下面将详细阐述这四种排序算法。 1. **归并排序(Merge Sort)**: 归并排序是一种分治策略的典型应用。...
希尔排序的时间复杂度一般认为是O(n^1.3),优于简单的插入排序的O(n^2),但比其他高级排序算法如快速排序或归并排序的时间复杂度要高。不过,希尔排序在处理部分有序的数组时表现良好,因此在某些特定场景下仍然是一...
一、实验目的 1、掌握排序的不同方法,并能用高级语言实现排序算法 二、实验内容 1、实现希尔排序算法。
然而,相比于其他更高级的排序算法(如快速排序、归并排序),希尔排序的平均时间复杂度并不占优。 在C语言中实现希尔排序,需要熟练掌握指针操作和循环控制,以下是一个简单的希尔排序C代码示例: ```c #include ...