数据结构 基础代码
(严蔚敏,人邮出版社)
第八章 排序—插入排序
直接插入排序 &&折半插入排序
#include <iostream>
#include <stdio.h>
using namespace std;
/*插入排序*/
void trace(int A[],int N)
{
int i;
for(i=0;i<N;i++)
{
if(i>0)
{
printf(" ");
}
printf("%d",A[i]);
}
printf("\n");
}
//直接插入排序
void insertionSort(int A[],int N)
{
int i,j,v;
for(i=0;i<N;i++)
{
v=A[i];
j=i-1;
while(j>=0 && A[j]>v)
{
A[j+1]=A[j];
j--;
}
A[j+1]=v;
trace(A,N);
}
}
//折半插入排序
void BInsertSort(int A[],int N)
{
int i,j,v;
int low,high,m;
for(i=1;i<N;i++)
{
v=A[i];
low=0;
high=i-1;
while(low<=high)
{
m=(low+high)/2;
if(v<A[m])
{
high=m-1;
}
else
low=m+1;
}
for(j=i-1;j>=high+1;--j)
{
A[j+1]=A[j];
}
A[high+1]=v;
trace(A,N);
}
}
int main()
{
int N,i;
int A[100];
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&A[i]);
}
trace(A,N);
BInsertSort(A,N);
return 0;
}
希尔排序
//希尔排序
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
long long cnt;
int l;
int A[1000000];
int n;
vector<int> G;//定义一个容器G,容器内的值为int类型,容器大小可变。
//指定了间隔g的插入排序
void insertionSort(int A[],int n,int g)
{
for (int i=g;i<n;i++)
{
int v=A[i];
int j=i-g;
while(j>=0 && A[j]>v)
{
A[j+g]=A[j];
j -=g;
cnt++;
}
A[j+g]=v;
}
}
void shellSort (int A[],int n)
{
for(int h=1; ; )//这段是不是可以写成 for(int h=1;h>n;3*h+1)
{
if(h>n)
{
break;
}
G.push_back(h);//在G中加入一个h;
h=3*h +1;
}
for (int i=G.size()-1;i>=0;i--)//如果把G看做一个数组,那么G.size()就是G中元素的个数
{
insertionSort(A,n,G[i]);
}
}
int main()
{
cin >> n;
for(int i=0;i<n;i++)
{
scanf("%d",&A[i]);
}
cnt = 0;
shellSort(A,n);
cout<< G.size()<<endl;
for(int i =G.size()-1;i>=0;i--)
{
printf("%d",G[i]);
if(i) //if(i)等价于if(i!=0)
{
printf(" ");
}
}
printf("\n");
printf("%d\n",cnt);
for(int i=0;i<n;i++)
{
if(i)
{
printf(" ");
}
printf("%d",A[i]);
}
return 0;
}
运行结果
5是数组中元素个数。
输入数组 5 1 4 3 2
2表示容器G的大小,就是所谓间隔数组的数组元素个数。
G中的具体数据为 4 1,也就是第一次取间隔为4,第二次取间隔为1。
cnt表示具体排序趟数,总共进行了3次。
输出排序后的结果:1 2 3 4 5