希尔排序基本思想
基本思想:
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。
给定实例的shell排序的排序过程
假设待排序文件有10个记录,其关键字分别是:
49,38,65,97,76,13,27,49,55,04。
增量序列的取值依次为:
5,3,1
排序过程如【动画模拟演示】。
http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.2.2.1.htm
#if 0
2012-12-09 18:23:18.019 排序算法[974:707] before :
2012-12-09 18:23:54.122 排序算法[974:707] after :26.1
2012-12-09 18:24:58.085 排序算法[999:707] before :
2012-12-09 18:25:00.967 排序算法[999:707] after :2.0
2012-12-09 18:40:25.880 排序算法[1081:707] before :
2012-12-09 18:40:30.379 排序算法[1081:707] after :4.5
2012-12-09 18:41:30.726 排序算法[1112:707] before :
2012-12-09 18:41:33.741 排序算法[1112:707] after :
2012-12-09 18:42:12.793 排序算法[1135:707] after :
2012-12-09 18:42:10.099 排序算法[1135:707] before :
2012-12-09 18:43:06.847 排序算法[1161:707] before :
2012-12-09 18:43:33.619 排序算法[1161:707] after :
#endif
#import <Foundation/Foundation.h>
//#include <stdio.h>
//#include <stdlib.h>
//#include <math.h>
#define MAX1 18 //这里设定要对多少个元素排序
void shellsort(int A[], int N, int *);
void printarray(int A[]);
void mysort(int m[]);
void quick_sort(int arr[], int left, int right);
int main (int argc, const char * argv[])
{
@autoreleasepool {
int i, s[MAX1];
int *sed;
int sedgewick[] = { // Sedgewick增量 赛奇维克增量
1073643521, 603906049, 268386305, 150958081, 67084289,
37730305, 16764929, 9427969, 4188161, 2354689,
1045505, 587521, 260609, 146305, 64769,
36289, 16001, 8929, 3905, 2161,
929, 505, 209, 109, 41,
19, 5, 1, 0 }; //用 0 标记终点
for (sed = sedgewick; *sed > MAX1; sed++) // 增量必须小于元素个数,并且是小于增量中的最大的一个。
{ }
for (i = 0; i < MAX1; i++){
s[i] = 1+(int) ((float)MAX1*rand()/(RAND_MAX+1.0));
}
// }
NSLog(@"before :");
// printarray(s);
NSLog(@"======%d======",*sed);
shellsort(s, MAX1, sed);//希尔排序
// mysort(s);//冒泡排序。
// quick_sort(s, 0, sizeof s / sizeof (int) - 1);//快速排序。
NSLog(@"after :");
printarray(s);
// for (int i=0; i<2; i++) //这里不加{}表示他把下个for循环都包裹了。因为他包裹的是一个if语句或一个for或一个”;“结尾的语句。
//// {
// for (int j=0; j<2; j++) {
// NSLog(@"我");
// }
//// }
}
return 0;
}
void shellsort(int v[], int n, int *sed)//v[]是数组的值,n为数组的个数。sed 赛奇维克增量
{
int i, j, temp;
int *gap;
for (gap = sed; *gap > 0; gap++)//看有几个赛奇维克。共10个数。 2,1;
for (i = *gap; i < n; i++)//越来越多的循环。
for (j = i - *gap; j>=0 && v[j]>v[j + *gap]; j-=*gap) {
temp = v[j];
v[j] = v[j + *gap];
v[j + *gap] = temp;
}
}
void mysort(int m[]){//普通的冒泡
int temp;
for (int i=0; i<MAX1; i++) {
for (int j=i; j<MAX1-1; j++) {
if (m[i]>m[j]) {
temp=m[i];
m[i]=m[j];
m[j]=temp;
}
}
}
}
void quick_sort(int arr[], int left, int right)//快速排序。
{
int i = left, j = right, temp = arr[i];
while (i < j)
{
while (i < j && temp <= arr[j])
{
j--; // 右边找到比temp小的那个数
}
arr[i] = arr[j];
while (i < j && arr[i] <= temp)
{
i++; // 左边找到比temp大的那个数
}
arr[j] = arr[i];
}
arr[i] = temp;
if (i - 1 > left) quick_sort(arr, left, i-1);
if (i + 1 < right) quick_sort(arr, i+1, right);
}
void printarray(int a[])
{
int i;
for (i = 0; i < MAX1; i++)
printf(" %d", a[i]);
printf("/n");
}
分享到:
相关推荐
本文将详细讲解六种经典的排序算法——合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合提供的文件名(sort.c、set.c、main.c、set.h、sort.h)推测出每个文件可能包含的代码实现。 1. **合并...
以下是关于"插入排序、选择排序、希尔排序、堆排序、冒泡、双向冒泡、快速排序、归并排序、递归的归并排序、基数排序"这十大经典排序算法的详细解释: 1. 插入排序:插入排序是一种简单的排序算法,它通过构建有序...
本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...
根据提供的文件信息,我们可以深入探讨几种经典的排序算法:冒泡排序、直接插入排序、快速排序以及希尔排序。这些算法在数据结构与算法课程中是非常重要的基础内容,它们各自有着独特的特性和应用场景。 ### 1. ...
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
直接插入排序 选择排序 堆排序 归并排序 快速排序 冒泡排序等七种排序方法
本主题将详细探讨希尔排序、冒泡排序、堆排序等经典的排序算法,这些都是数据结构与算法学习中的核心内容,尤其对于北邮数据结构课程来说,理解并掌握这些排序方法至关重要。 1. **插入排序**: 插入排序是一种...
10种排序算法代码+综合比较代码(直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、折半插入排序、2路插入排序),其中不仅有各种排序算法的代码,还包含10种代码在关键字...
本主题涵盖了六种经典的排序算法:希尔排序、堆排序、快速排序、简单选择排序、插入排序和冒泡排序。这些算法各有特点,适用于不同的场景,下面将逐一详细介绍。 1. **希尔排序**:希尔排序是由Donald Shell提出的...
这里我们关注的是六种经典的排序算法:快速排序、选择排序、冒泡排序、希尔排序、插入排序以及懒人排序。这六种算法都是使用C语言实现的,因此对C编程有一定的基础要求。 1. **快速排序**:由英国计算机科学家C.A.R...
本文将深入探讨Java编程语言中实现的七种主要排序算法:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序以及归并排序。每种算法都有其独特性,适用于不同的场景和数据特性。 1. **直接插入排序**:...
七种排序算法(包括直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,简单选择排序,归并排序) 还有两道题 1./*设计并实现一个有效的对n个整数重排的算法,使得所有负数位于非负数之前,给出算法的性能...
6. **双向冒泡排序**(Bidirectional Bubble Sort):双向冒泡排序是在冒泡排序的基础上改进的,同时从数组两端向中间进行比较,减少了不必要的交换次数,但其平均时间复杂度仍为O(n^2)。 7. **快速排序**(Quick ...
python八个常用排序(插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序)
十大经典排序算法的实现:快速排序、堆排序、希尔排序、插入排序、冒泡排序、选择排序、归并排序、计数排序_SortAlgorithms
排序算法汇总(选择排序、直接插入排序、冒泡排序、希尔排序、快速排序、堆排序) 本资源介绍了六种常用的排序算法:选择排序、直接插入排序、冒泡排序、希尔排序、快速排序和堆排序。下面对每种算法进行详细介绍:...
常见的排序方法_python插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数_AllSort
C语言所有排序大全,解决了您日常上课考试学习的需要,在这里每一个程序都没有错误,其中压缩包包括了归并排序;...快速排序;冒泡排序;选择排序;折半排序;希尔排序这些日常排序,因为是全集所以大家踊跃下载
排序算法汇总P: 冒泡排序快速排序直接选择排序插入排序希尔排序 堆排序........
常见的几种排序方式,包括选择排序,冒泡排序,快速排序,希尔排序,堆排序,插入排序。vs2008实现,对话框方式,主要实现字符串的由小到大排序。点击“几种排序方法.vcproj“运行。字符集使用多字节集,不能用...