插入排序部分

#ifndef _SORT_H
#define _SORT_H
#include <stdio.h>
#include <time.h>///时间种子的头文件
#include <malloc.h>
#include <cassert>
//提高效率的方法:减少比较和移动数据的次数
//插入排序
//1、直接插入排序(稳定)
void PrintArray(int* ar, int left, int right)
{
    for (int i = left; i < right; i++)
        printf("%d", ar[i]);
    printf("\n");
 }

void InsertSort_1(int* ar, int left, int right)
{
    for (int i = left + 1; i < right; i++)
    {
        //寻找插入位置
        int k = left;
        while (ar[i] > ar[k])
            k++;
        //移动数据
        int temp = ar[i];
        for (int j = i; j > k; j--)
        {
            ar[j] = ar[j - 1];

        }
        ar[k] = temp;
    }
}
//测试效率
void  TestSortEfficienty()
{
    int n = 10000;
    //开辟空间
    int* a = (int*)malloc(sizeof(int) * n);
    srand(time(0));
    for (int i = 0; i < n; i++)
    {
        a[i] = rand();
    }
    time_t start = clock(a,0,n);
    time_t end = clock();
    printf("%d", end - start);
}
int Swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
//从后往前比较
void InsertSort_2(int* ar, int left, int right)
{
    for (int i = left + 1; i < right; i++)
    {
        int j = i;
        while (j > left && ar[i] < ar[j - 1])
            Swap(&ar[j], &ar[j - 1]);//调用函数,时间效率低
        /*
        int tmp=ar[j];
        ar[j]=ar[j-1];
        ar[j-1]=tmp;
        --j;
        
        */
        j--;
    }
}
//带哨兵的直接插入排序
void InsertSort_3(int* ar, int left, int right)
{
    for (int i = left + 1; i < right; i++)
    {
        ar[0] = ar[i];//哨兵位
        int j = i - 1;
        while (ar[j] > ar[0])
        {
            ar[j + 1] = ar[j];
            j--;
        }
        ar[j] = ar[0];
    }
    
}
//折半插入排序
void BinInsertSort(int* ar, int left, int right)
{
    for (int i = left + 1; i < right; i++)
    {
        int tmp = ar[i];
        int low = left;
        int high = i - 1;
        while (low <= high)
        {
            int mid = (low + high) / 2;
            if (ar[i] < ar[mid])
            {
                int high = mid - 1;
            }
            else if (ar[i] > ar[mid])
            {
                int low = mid + 1;
            }
        }
        for (int j = i; j > low; --j)
            ar[j] = ar[j - 1];
        ar[low] = tmp;
    }

}
//2-路插入排序,空间复杂度O(n)
void TwoWayInsertSort(int* ar, int left, int right)
{
    int n = right - left;
    int* tmp = (int*)malloc(sizeof(int) * n);
    assert(tmp != NULL);
    tmp[0] = ar[left];
    int start, final;
    start = final = 0;
    for (int i = left + 1; i < right; ++i)
    {
        if(ar[i]<tmp[start])
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值