希尔排序和快速排序

//希尔排序

在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。

如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。

D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,

每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。

当增量减到1时,整个要排序的数被分成一组,排序完成

public class TestXe {

public static int[] a = { 10, 32, 1, 9, 5, 8, 88, 12, 0, 4, 3, 66 }; // 预设数据数组

public static void main(String args[]) {

int i; // 循环计数变量

int Index = a.length;// 数据索引变量

for (i = 0; i < Index - 1; i++)

System.out.printf("%3s ", a);

System.out.println("");

ShellSort(Index - 1); // 选择排序

for (i = 0; i < Index - 1; i++)

System.out.printf("%3s ", a);

System.out.println("");

}

public static void ShellSort(int Index) {

int i, j, k; // 循环计数变量

int Temp; // 暂存变量

boolean Change; // 数据是否改变

int DataLength; // 分割集合的间隔长度

int Pointer; // 进行处理的位置

DataLength = (int) Index / 2; // 初始集合间隔长度

while (DataLength != 0) // 数列仍可进行分割

{

// 对各个集合进行处理

for (j = DataLength; j < Index; j++) {

Change = false;

Temp = a[j]; // 暂存Data[j]的值,待交换值时用

Pointer = j - DataLength; // 计算进行处理的位置

// 进行集合内数值的比较与交换值

while (Temp < a[Pointer] && Pointer >= 0 && Pointer <= Index) {

a[Pointer + DataLength] = a[Pointer];

// 计算下一个欲进行处理的位置

Pointer = Pointer - DataLength;

Change = true;

if (Pointer < 0 || Pointer > Index)

break;

}

// 与最后的数值交换

a[Pointer + DataLength] = Temp;

if (Change) {

// 打印目前排序结果

System.out.print("排序结果: ");

for (k = 0; k < Index; k++)

System.out.printf("%3s ", a[k]);

System.out.println("");

}

}

DataLength = DataLength / 2; // 计算下次分割的间隔长度

}

}

}

--------------------------------------------------------------

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。①以第一个关键字
K 1 为控制字,将 [K 1 ,K 2 ,…,K n ] 分成两个子区,使左区所有关键字小于等于 K 1 ,右区所有关键字大于等于 K 1 ,最后控制字居两个子区中间的适当位置。在子区内数据尚处于无序状态。 ②把左区作为一个整体,用①的步骤进行处理,右区进行相同的处理。(即递归)③重复第①、②步,直到左区处理完毕。

public class QuickSort {

/**

* 快速排序,对整数型数组o进行

*/

public static void quiteSort(int[] o, int low, int hight) {

if (low < hight) {

int povitePosition = adjust(o, low, hight);

quiteSort(o, low, povitePosition - 1);

quiteSort(o, povitePosition + 1, hight);

}

}

/**

* 进行调整

*/

private static int adjust(int[] o, int low, int hight) {// 选定枢轴为low所对应的值

int pivote = o[low];

while (low < hight) {

while (hight > low && compare(pivote, o[hight]) <= 0) {// 高位找到比povite大,则符合要求,继续寻找

hight--;

}

o[low] = o[hight];

while (low < hight && compare(pivote, o[low]) >= 0) { // 低位开始找到比povite小,符合要求,继续寻找

low++;

}

o[hight] = o[low];

}

o[low] = pivote;

return low;

}

/**

* @param num1  减数

* @param num2  被减数

*/

private static int compare(int num1, int num2) {

return num1 - num2;

}

public static void main(String[] args) {

int[] i = { 26, 53, 48, 15, 13, 46, 32, 18, 16 };

quiteSort(i, 0, i.length - 1);

for (int ii : i) {

System.out.print(ii + " ");

}

}

}

希尔排序和快速排序,布布扣,bubuko.com

时间: 2024-10-13 00:31:43

希尔排序和快速排序的相关文章

插入排序 | 冒泡排序 | 希尔排序 | 堆排序 | 快速排序 | 选择排序 | 归并排序

以下是最近学习各种算法的代码实现: #include <stdlib.h> #include <stdio.h> #include <time.h> #include <limits.h> typedef int EleType; typedef int (*CompFunc)(void *,void *); int IntComp(void * a,void *b) { if(*(int *)a > *(int *)b) return 1; if(*

插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——C++实现

首先是算法实现文件Sort.h,代码如下: /* * 实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 * 以及快速排序.归并排序.堆排序和LST基数排序 * @author gkh178 */ #include <iostream> template<class T> void swap_value(T &a, T &b) { T temp = a; a = b; b = temp; } //插入排序:时间复杂度o(n^2) template<

JavaScript排序算法(希尔排序、快速排序、归并排序)

以var a = [4,2,6,3,1,9,5,7,8,0];为例子. 1.希尔排序. 希尔排序是在插入排序上面做的升级.是先跟距离较远的进行比较的一些方法. function shellsort(arr){ var i,k,j,len=arr.length,gap = Math.ceil(len/2),temp; while(gap>0){ for (var k = 0; k < gap; k++) { var tagArr = []; tagArr.push(arr[k]) for (i

冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析

冒泡排序 1 //冒泡排序 2 ////////////////////////////////////////////////////////////////////////// 3 void BubleSort(int a[],int n) 4 { 5 int temp; 6 bool flag=false; 7 for (int i=0;i<n;i++) 8 { 9 flag=true; 10 for (int j=0;j<n-i-1;j++) 11 { 12 if(a[j]>a[

js排序 希尔排序,快速排序

希尔排序: 定义一个间隔序列,例如是5,3,1.第一次处理,会处理所有间隔为5的,下一次会处理间隔为3的,最后一次处理间隔为1的元素.也就是相邻元素执行标准插入排序. 在开始最后一次处理时,大部分元素都将在正确的位置,算法就不必对很多元素进行交换,这是比插入元素高级的地方. 时间复杂度O(n*logn) 1 function shellSort(){ 2 var N=arr.length; 3 var h=1; 4 while(h<N/3){ 5 h=3*h+1;//设置间隔 6 } 7 whi

浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析(好戏在后面,有图有真相)

由于没考虑到一些情况,对以上一些算法做了改进和对比!以及昨晚把希尔排序写错而误以为其效率高过快速排序的糗事,今天一一做了更正和说明,如果你绝得本随笔不是很妥可以尝试看看这http://www.cnblogs.com/maxiaofang/p/3382927.html,有错误或不妥欢迎指正!!共同学习,共同进步!O(∩_∩)O哈哈~ 推荐一段博友分享的排序视频很艺术.很形象.很生动哦(http://www.oschina.net/question/561584_65522) 最近一段时间去武汉参加

希尔排序与快速排序

希尔排序法 希尔排序也是一种插入排序,他是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序 希尔排序交换法 package sort; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; public class ShellSort { public static void main(String[] args) { int[] arr = new int[800000

排序五:希尔排序

希尔排序(Shell Sort)也是插入排序的一种.也称为缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名. 基本思想: 将待排序列划分为若干组,在每一组内进行插入排序,以使整个序列基本有序,然后再对整个序列进行插入排. 再从百度上贴个示例: 希尔增量: 希尔增量是指希尔提出了一种冲破二次时间屏障的算法. Donald Shell 提出了一种冲破二次时间屏障的算法Shellsort(希尔排序),在希尔排序中希尔给出了

希尔排序(插入排序)-八大排序三大查找汇总(5)

基本思想 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 稳定性 由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的. 时间复杂度 希尔排序的时间复杂度取决于步长的选择. 平均情况下,