#include<iostream>
using namespace std;
//升序
//直接插入排序(稳定)
void InsertSort(int arr[],int left,int right)
{
for(int i=left+1;i<=right;i++)
{
if(arr[i]<arr[i-1])
{
int temp=arr[i];
int j=i-1;
do
{
arr[j+1]=arr[j];
j--;
}while(j>=left && temp<arr[j]);
arr[j+1]=temp;
}
}
}
//折半插入排序(稳定)
void BinaryInsertSort(int arr[],int left,int right)
{
for(int i=left+1;i<=right;i++)
{
int temp=arr[i];
int low=left;
int high=i-1;
while(low<=high)
{
int middle=(low+high)/2;
if(temp<arr[middle])
{
high=middle-1;
}
else
{
low=middle+1;
}
}
for(int k=i-1;k>=low;k--)
{
arr[k+1]=arr[k];
}
arr[low]=temp;
}
}
//希尔排序(设置间隔gap,再利用直接插入排序的思想) (不稳定)
void ShellSort(int arr[],int left,int right)
{
int gap=right-left+1;
do
{
gap=gap/3+1;
for(int i=left+gap;i<=right;i++)
{
if(arr[i]<arr[i-gap])
{
int temp=arr[i];
int j=i-gap;
do
{
arr[j+gap]=arr[j];
j=j-gap;
}while(j>=left && temp<arr[j]);
arr[j+gap]=temp;
}
}
}while(gap>1);
}
void test()
{
int arr[7]={21,16,49,25,20,13,7};
//InsertSort(arr,0,6);
//BinaryInsertSort(arr,0,6);
ShellSort(arr,0,6);
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
int main()
{
test();
system("pause");
return 0;
}
直接插入排序、折半插入排序、希尔排序
最新推荐文章于 2021-07-14 18:57:20 发布