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

希尔排序基本思想

  基本思想:
     先取一个小于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");
}

猜你喜欢

转载自zhangmingwei.iteye.com/blog/1744634