例如:2,1,8,3从小到大排序
步骤:
1.假设该数组为a[],先看第一个数2,一个数必然有序,所以遍历的时候,n个数只需要遍历n-1次;
2.接着排1,排哪个先将哪个拿出来 tmp=1;(假如此时1下标为n,2的下标为j,所以j=n-1)
1<2,所以a[j+1]=a[j](将2后移一位,1已经拿出来了,1原来位置是空的),比完一次j要减1,tmp继续和a[j]比,因为2已经是第一个元素,所以1放在2原来位置。
3.后面8,3,同理。
代码如下
#include<iostream>
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
}Sqlist;
//初始化
void Initlist_Sq(Sqlist &L)
{
L.elem=new ElemType[10];
L.length=0;
if(L.elem)
{
cout<<"初始化成功"<<endl;
}
else
{
cout<<"初始化失败"<<endl;
}
}
//建立顺序表
void CreatList_Sq(Sqlist &L)
{
ElemType n;
cout<<"请输入你要建立顺序表中元素个数"<<endl;
cin>>n;
cout<<"请输入你要你想要建立顺序表中的值"<<endl;
for(int i=0;i<n;i++)
{
cin>>L.elem[i];
L.length++;
}
cout<<"建立成功!"<<endl;
}
//遍历当前顺序表
void ShowList_Sq(Sqlist L)
{
cout<<"当前顺序表长度为"<<L.length<<endl;
cout<<"当前顺序表中元素为:";
for(int i=0;i<L.length;i++)
{
cout<<L.elem[i]<<" ";
}
}
//排序算法,直接插入式
void Insertsort(Sqlist &L)
{
int j;
int tmp;
for(int i=1;i<L.length;i++) //单个元素有序不需要排序,n个数据遍历n-1次就够了
{
if(L.elem[i]<L.elem[i-1])//第i个小于第i-1个(不符合升序,下面进行插入式排序)
{
tmp=L.elem[i]; //将需要排序的取出来
for(j=i-1;j>=0 && L.elem[j]>tmp;j--)//从需要排序元素前一个开始排序,循环需要满足两个条件
{ //(1),j有意义(不小于0)(2)需要排序元素前面元素中
L.elem[j+1]=L.elem[j]; //存在大于该元素的值
}
L.elem[j+1]=tmp;
}
}
cout<<"排序成功"<<endl;
}
int main()
{
Sqlist L;
ElemType n;
//初始化
Initlist_Sq(L);
//建立
CreatList_Sq(L);
//排序直接插入
Insertsort(L);
//遍历顺序表
ShowList_Sq(L);
return 0;
}
代码结果如下;