排序算法学习(插入排序)

排序算法分为内部排序和外部排序:
外部排序:当文件较大,以至于内存不足以存放全部记录,需要借助外存的访问。
内部排序:适合 小文件。一般分为插入排序,选择排序,交换排序,归并排序,基数排序等。
稳定与不稳定:
对于在原始文件中,如果第i个数据等于第j个数据,且i>j,当排序之后如果i>j,那么称算法为稳定的,否则就是不稳定的。

插入排序

插入排序就是将待排序的算法分为两个区域,一个是有序区域,另一个是无序区域。每次将无序区域的第一个记录按照关键字值得大小插入到有序区域,直到全部变成无序区域位置。

直接插入排序(稳定)

直接插入排序的具体做法是在插入第i个记录时,r1,r2…ri-1.已经排好序。这时将ri依次与关键字ri-1,ri-2,…r1进行比较,从而找到应该插入的点。
第一种最原始的做法

template<typename T>
void direct_insert_sort(T* array,int length)
{
    int i = 0;
    int j = 0;
    int k = 0;
    T temp;
    for (i = 1; i<length; i++) /*i从1到length-1,因为第一个元素可以看做排好序,i就是需要插入的元素的编号 */
    {
        for (j = 0; j<i; j++)/*j从0到i-1,这个区域就是排好序的区域,从后往前进行遍历 */
        {
            /*当array[i]>=array[j] 时,表示需要插入的元素大于等于已排序部分的遍历的当前值*/
            if (array[i]>=array[j])
                continue;/*此时j继续后移,直到找到第一个array[i]<array[j] */
            else
            {
                temp = array[i];/*下面的部分为将[j+1:i] */
                for (k = i; k>j; k--)
                {
                    array[k] = array[k - 1];
                }
                array[j] = temp;
            }
        }
    }
}

第二种的做法


template<typename T>
void direct_insert_sort(T *array, int length)
{
    int i=0;int j=0;
    T temp;
    for(i=1;i<length;i++)
    {
        temp = array[i];
        j = i - 1;
        while (array[j]>temp)
        {
            array[j + 1] = array[j];/*从J=i-1开始,如果array[i]<array[j],那么将array[j] */
            j--;
        }
        array[j + 1] = temp;
    }
}

希尔排序(不稳定)

缩小增量排序

void shellsort2(int *v, int n)
{
    int gap, i, j, k,temp;
    /*每一种步长*/
    for (gap = n / 2; gap > 0; gap /= 2)
    {
        /*当前选择步长的每一个起始位置*/
        for (i = 0; i <gap; i++)

        {
            /*第二种直接插入排序,只不过步长由1变成了gap*/
            for (j = i + gap; j < n; j = j + gap)
            {
                temp = v[j];
                k = j - gap;
                while (v[k]>temp)
                {
                    v[k+gap] = v[k];
                    k=k-gap;
                }
                v[k + gap] = temp;
            }
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值