希尔排序,快速排序,冒泡排序的比较。

希尔排序基本思想

基本思想:
  先取一个小于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");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值