_在路上

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

下面的源代码出来源于我在“西安朱洪计算机培训”学习时的老师之手,马上要找工作了,赶紧复习下,顺便分享下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/************************************************************************/
/* 插入排序算法思想:考虑打扑克牌时的抓牌过程,从小到大排序,           */
/* 前面总是已经排序好的,新牌插入到合适的位置。                         */
/************************************************************************/
void insertSort (int *d, int start, int step, int len)
{
    int t, i, j;

    for (i = start + step; i < len; i += step)
    {
        t = d[i];   /* 抽出当前下标元素的值 */

        /* 前面总是已排序好的,从已排序好的位置找插入位置,排序稳定 */
        for (j = i - step; j >= start && t < d[j]; j -= step)
        {
            /* 把比当前值(t)大的元素都向其后移动一个位置,空出位置d[j] */
            d[j + step] = d[j];
        }

        /* d[j + step]是一个空位置,要插入的位置 */
        d[j + step] = t;
    }
}

/************************************************************************/
/* 希尔排序算法思想:将记录分成若干子序列,子序列数目的分法和           */
/* 步长(间隔)有关;子序列按直接插入排序执行排序。                     */
/************************************************************************/
void shellSort (int *d, int len)
{
    int start, step;
    
    /* step是步长(间隔),步长越小,子序列数目越少;*/
    /* step每改变一次,整个记录就重排序一次 */
    for (step = len >> 1; step; step >>= 1)
    {
        /* 定位每个子序列的起始下标 */
        for (start = 0; start < step; ++start)
        {
            /* 子序列按直接插入排序执行排序 */
            insertSort(d, start, step, len);
        }
    }
}

void Insert_Example (void)
{
    int i;
    int arr[7] = {10, 7, 11, 12, 9, 21, 6};
    
    shellSort(arr, 7);  //insertSort(arr, 0, 1, 7);
    for (i = 0; i < 7; i++)
        printf("%4d, ", arr[i]);    
}


int main ()
{
    Insert_Example();
    
    return 0;
}

直接插入排序:稳定排序;时间复杂度O(n^2)。

希尔排序:不稳定排序,如:{2,4,1,2} 一次排序后为{1,2,2,4};事件复杂度:O(n^1.5)。

posted on 2012-10-08 20:37  _在路上  阅读(250)  评论(0编辑  收藏  举报