Chinaunix首页 | 论坛 | 博客
  • 博客访问: 413545
  • 博文数量: 168
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-09 13:46
文章分类

全部博文(168)

文章存档

2015年(51)

2014年(30)

2013年(87)

我的朋友

分类: C/C++

2013-10-12 14:46:13

原文地址:数据结构深入剖析(7) 作者:mq24705

一、希尔排序(不稳定)
1、基本思想:将待排序列划分为若干组,在每一组内进行插入排序,以使整个序列基本有序,然后再对整个序列进行插入排序。
2、示例
例如:将n 个数据元素分成d 个子序列:
{ R[1],R[1+d],R[1+2d],…,R[1+kd] }
{ R[2],R[2+d],R[2+2d],…,R[2+kd] }

{ R[d],R[2d],R[3d],…,R[kd],R[(k+1)d] }
其中,d 称为增量,它的值在排序过程中从大到小逐渐缩小,直至最后一趟排序减为1。
3、实现
#include  
void printarray(int array[],int len)
{
    int i = 0;
    for(i = 0; i < len;i++){
        printf("%d ",array[i]);
    }
    printf("\n");
}
void ShellSort(int array[],int len)
{
    int i = 0;
    int j = 0;
    int k = -1;
    int temp = -1;
      int gap = len;
/*
    for(i = 1;i < len;i++){
        k = i;
        temp = array[k];

        for(j = i-1;(j >= 0)&& (array[j] > temp);j--){
            array[j+1] = array[j];
            k = j;
        }
    array[k] = temp;
    }
*/
    do{
        gap = gap / 3 + 1;
//gap 最后收敛于1
        for(i = gap; i < len; i += gap){
            k = i;
            temp = array[k];
            for(j = i - gap; (j >= 0) && (array[j] > temp);j -= gap){
                array[j + gap] = array[j];
                k = j;
            }
            array[k] = temp;
        }
    }while(gap > 1);

}
int main()
{
    int array[] = {21,25,49,25,16,8};
    int len = sizeof(array) / sizeof(*array);
    printarray(array,len);
    ShellSort(array,len);
    printarray(array,len);
    return 0;
}
二、快速排序(不稳定)
1、基本思想
1)任取待排序序列中的某个数据元素作为基准,按照该元素的关键字大小将整个序列划分为左右两个子序列:
---左侧子序列中的所有元素都小于或等于基准元素
---右侧子序列中的所有元素都大于基准元素
---基准元素排在这两个子序列中间
2)分别对这两个子序列重复执行上述方法,直到所有的对象都排在相对于的位置上为止。
2、实现
#include
void printarray(int array[],int len)
{
    int i = 0;
    for(i = 0; i < len;i++){
        printf("%d ",array[i]);
    }
    printf("\n");
}
void swap(int array[],int i,int j)
{
    int temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}
int partition(int array[],int low,int high)
{
    int pv = array[low];
    while(low < high){
        while((low < high) && (array[high] >= pv)){
        high--;
        }
        swap(array,low,high);
        while((low < high) && (array[low] <= pv)){
            low++;
        }
        swap(array,low,high);
    }
    return low;
}
void QSort(int array[],int low,int high)
{
    if(low < high){
        int pivot = partition(array,low,high);
        QSort(array,low,pivot-1);
        QSort(array,pivot+1,high);
    }
}
void QuickSort(int array[],int len)
{
    QSort(array,0,len-1);
}
int main()
{
    int array[] = {21,25,49,25,16,8};
    int len = sizeof(array) / sizeof(*array);
    printarray(array,len);
    QuickSort(array,len);
    printarray(array,len);
    return 0;
}
三、归并排序(稳定)
1、基本思想
将两个或两个以上的有序序列合并成一个新的有序序列:
有序序列V[1] …V[m]和V[m+1] …V[n]合并为V[1] …V[n],这种归并方法称为2路归并。
将3个有序序列归并为一个新的有序序列,称为3路归并。
将多个有序序列归并为一个新的有序序列,称为多路归并。
2、实现
#include  
#include
void printarray(int array[],int len)
{
    int i = 0;
    for(i = 0; i < len;i++){
        printf("%d ",array[i]);
    }
    printf("\n");
}
Merge(int src[],int des[],int low,int mid,int high)
{
    int i = low;
    int j = mid + 1;
    int k = low;

    while((i <= mid) && (j <= high)){
        if(src[j] < src[i]){
            des[k++] = src[j++];
        }else{
            des[k++]= src[i++];
        }
    }
    while(i <= mid){
        des[k++]= src[i++];
    }
    while(j <= high){
        des[k++]= src[j++];
    }
}
void Msort(int src[],int des[],int low,int high,int max)
{
    if(low == high){
        des[low] = src[low];
    }else{
        int mid = (low + high) / 2;
        int* space = (int*)malloc(sizeof(int)*max);
        if(space != NULL){
            Msort(src,space,low,mid,max);
            Msort(src,space,mid+1,high,max);
            Merge(space,des,low,mid,high);
        }
        free(space);
    }
}
void MergeSort(int array[],int len)
{
    Msort(array,array,0,len - 1,len);
}
int main()
{
    int array[] = {21,25,49,25,16,8};
    int len = sizeof(array) / sizeof(*array);
    printarray(array,len);
    MergeSort(array,len);
    printarray(array,len);
    return 0;
}

四、总结
希尔排序,快速排序和归并排序将排序算法的时间复杂度提高到了O(n*logn)
希尔排序和快速排序的排序结果是不稳定的
归并排序的排序结果是稳定的
阅读(795) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~