#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])
}
}