栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

插入排序部分

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

插入排序部分

#ifndef _SORT_H
#define _SORT_H
#include
#include ///时间种子的头文件
#include
#include
//提高效率的方法:减少比较和移动数据的次数
//插入排序
//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]);//调用函数,时间效率低
        
        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]     }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/861515.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号