shell排序

十大经典排序算法

天大地大妈咪最大 提交于 2019-11-29 01:58:15
0.1 排序的定义 对一序列对象根据某个关键字进行排序。 0.2 术语说明 稳定: 如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定: 如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序: 所有排序操作都在内存中完成; 外排序: 由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个算法执行所耗费的时间。 空间复杂度: 运行完一个程序所需内存的大小。 0.3 算法总结 0.4 算法分类 1、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序介绍: 冒泡排序 1.1 算法描述 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1~3,直到排序完成。 代码实现 2、选择排序(Selection Sort) 2.1 算法描述 n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:

Java八大排序之希尔(Shell)排序

≡放荡痞女 提交于 2019-11-27 15:31:05
希尔排序 (Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。 Shell插入排序的具体做法是:对有n个记录进行排序,首先取1个整数d<n,将这n个记录分成d组,所有位置相差为d的倍数的记录分在同一组,在每组中使用直接插入排序进行组内排序,然后缩小d的值,重复进行分组和组内排序,一直到d=1结束。 执行过程图: 代码: 1 public class TestShell { 2 //插入排序 3 public static void shellSort(int[] arrays){ 4 int d,j,temp; 5 d = arrays.length/2; 6 //增量大于等于1 7 while(d>=1){ 8 //从第d个元素开始,将所有元素有序插入相应分组中 9 for (int i = d; i < arrays.length; i++){ 10 temp = arrays[i]; //保存第i个元素 11 j = i - d; //向前找插入位置 12 while(j>=0 && temp < arrays[j]){ //排序码比较找插入位置并后移 13 arrays[j+d] =

Shell排序

爷,独闯天下 提交于 2019-11-26 14:34:53
接下来的几篇博客都是关于排序的;主要有插入类排序;交换类排序;选择类排序; 插入类排序主要有直接插入如排序(straight insertion sort);折半插入排序(bianry insertion sort); Shell sort; 交换类排序主要有冒泡排序(bubble sort); 快速排序(quick sort); 选择类排序主要有;简单选择排序(simple selection sort); 堆排序(heap sort); 除此之外还有归并排序(merge sort); 基数排序等; 本篇博客是关于Shell排序的; 排序直接的数据结构介绍; 所有的排序均以线性表存储;所有的排序算法避免不了交换;交换就要用到临时变量;故将线性表中编号为0的元素不存储任何有效元素;仅仅当做临时变量或者记录的作用来使用; 对于有些算法我会给出局部变量做临时变量的算法 ;若对线性表不是很了解;参见前面关于线性表的博客; 头文件(sort.h); # ifndef _SORT_ typedef int KeyType; typedef struct { KeyType key; }DataType; # endif 头文件(SeqList.h); typedef struct { DataType data[MAXSIZE]; int length; }SeqList, *