希尔排序和高速排序

//希尔排序

在直接插入排序算法中,每次插入一个数,使有序序列仅仅添加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; // 计算下次切割的间隔长度

}

}

}

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

通过一趟排序将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列。①以第一个keyword
K 1 为控制字,将 [K 1 ,K 2 ,…,K n ] 分成两个子区,使左区全部keyword小于等于 K 1 ,右区全部keyword大于等于 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-18 00:56:17

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

经典排序之高速排序

高速排序堪称最经典的排序.思想是选一个基准值.一般选第一个.然后全部的值与基准值比較,大的位置不变, 小的位置与第一个大的位置互换,就这样进行第一轮排序.然后对于基准值二边的再进行排序,依次类推,直到为剩一个. 以下是快排的代码: public class QuickSort { public void quickSort(int a[],int start,int end){ //比較这个数组是否仅仅有一个值没有进行高速排序 if(start<end){ //基准值 int keyword=a

C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序

以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序,然后是測试的样例.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

交换排序之高速排序

今天大鹏哥跟大家一起学习下交换排序中的高速排序. 高速排序是对冒泡排序的一种改进.它的基本思想是.通过一趟排序将待排记录切割成独立的两部分,当中一部分记录的keyword均比还有一部分的keyword小.则可分别对这两部分记录继续进行排序,以达到真个序列有序. 高速排序基本步骤: Step1.定义两个变量low和high,他们的初值分别为low和high,此外另一个变量pivotkey. Step2.首先从high所指位置向前搜索找到第一个keyword小于pivotkey的记录和pivotke

算法导论 第7章 高速排序

高速排序在最坏情况下的时间复杂度为O(n^2),尽管在最坏情况下执行时间比較差,可是高速排序一般是用于排序的最佳选择.由于其平均性能相当好,期望的执行时间为O(nlgn),且在O(nlgn)的记号中隐含的常数因子非常小. 高速排序和合并排序有相似之处,都是须要划分序列,在合并排序中.划分的过程非常easy.直接选择元素序列的中间位划分位置,排序是在合并的过程中实现的,所以合并排序的合并过程非常重要.相比合并排序,高速排序就没有合并的过程.仅仅有划分,高速排序的划分过程非常重要,排序是在划分的过程

高速排序算法C++实现

//quick sort //STL中也有现成的高速排序算法.内部实现採用了下面技巧 //1)枢轴的选择採取三数取中的方式 //2)后半段採取循环的方式实现 //3)高速排序与插入排序结合 #include<vector> #include<iostream> #include<algorithm> using namespace std; //这一版本号是最简单实现版本号.对于高速排序的优化主要有下面几个方面: //1)枢轴的选择.若枢轴选取不全适.比方,若每次递归时

白话经典算法系列之六 高速排序 高速搞定

高速排序因为排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被採用,再加上高速排序思想----分治法也确实有用,因此非常多软件公司的笔试面试,包含像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也经常出现高速排序的身影. 总的说来,要直接默写出高速排序还是有一定难度的,因为本人就自己的理解对高速排序作了下白话解释,希望对大家理解有帮助,达到高速排序,高速搞定. 高速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它採用了一种分治的

排序算法之高速排序

这一个博客将高速排序讲的挺好的:http://blog.csdn.net/morewindows/article/details/6684558 一.算法思想描写叙述 1)令i = L,j = R,将基准数挖出形成第一个坑(基准数能够选择第一个位置上的数作为基准数,也能够选择其它位置上的数作为基准数). 2)j--   . 从后往前扫,找到第一个比基准数小的数.并将其"挖出",填到上一个形成的坑中arr[i] 3)i++ . 从前往后扫,找到第一个比基准数大的数.并将其"挖出

高速排序

所谓的高速排序,就是在一些中,找一个数(如果为a)为基准.把这些数分成两部分.一部分小于等于a,还有一部分大于a. 思路: (1)在这些数中,设置一个指针指向第一个(low),一个指针指向最后一个(high).设置一个基点(取第一个)为v (2)从高位置high開始.假设*high > v,则high--,然后看low,假设*low<v,则low++. (3)交换*low和*high (4)递归运行上面的 #include <stdio.h> void swap(int *a,in

高速排序算法

高速排序算法 作者 July  二零一一年一月四日------------------------------------------ 写之前,先说点题外话.每写一篇文章,我都会遵循下面几点原则:一.保持版面的尽量清晰,力保排版良好.二.力争所写的东西,清晰易懂,图文并茂三.尽最大可能确保所写的东西精准,有实用价值. 由于,我认为,你既然要把你的文章,发布出来,那么你就一定要为你的读者负责.不然,就不要发表出来.一切,为读者服务. ok,闲不多说.接下来,咱们立马进入本文章的主题,排序算法.众所