排序(Sorting)是程序设计里面的一种重要的操作,它的功能是将原本无序的数据元素集合或序列按照一定规则排列成有序的序列排序常用在查找过程中。
排序的方法有很多种,常见的有插入排序法(InsertionSort)、交换排序法(Exchange Sort)、选择排序法(Select Sort)、归并排序法(Merge Sort)、基数排序法(Radix Sort)下图是常见排序算法的分类图:
今天我写的是插入排序算法中的直接插入排序 (以后我会将其他算法写好上传)
1、直接插入排序算法的关键在于每次插入新的元素后新数组必须是有序的即
设原来的数据是有序排列的
Data[1].key ≤ data[2].key ≤ … ≤data[j-1].key
插入一个元素data[j].key后使得新序列为
Data[1].key ≤ data[2].key ≤ … ≤data[j - 1].key ≤ data[j].key
伪代码如下:
这里用一个例子作为说明:
假设有4个已经排序的序列data[1]~data[4],现要将data[5]按从小到大的排列的插入其中(data[0]留空作为哨兵)
将data[0]的值赋为data[5].
j=i-1=4 :
j=4,data[0]< data[4]则data[j+1]=data[j],j=j-1
j=3,data[0] >= data[3]则插入位置确定,在j+1位置插入数据即data[4]=data[0]
这样一次插入后新序列为
此时新序列data[1]~data[5]是扩充一个单位后的数组
2、如果有data[1…n]n个待排的序列,data[1]由于只有一个元素,已经有序,则从第二个数开始向有序插入新数据,逐步扩充有序数组的大小,直到n个有序数组。下面同样给出一个例子:
3、我们用C++语言实现这个算法:
首先数据类型用顺序存储结构定义如下
#define MaxSize 100 //最大排序100个数据
typedef int KeyType;
typedef int OtherType;
typedef struct
{
KeyType key; //相当于定义int key;
OtherType other;
}ElemType;
typedef struct
{
ElemType data[MaxSize + 1];
int length;
}Sqlist;//顺序表的形式
接着算法实现函数
void InsertSort(Sqlist &L) //这里使用引用传递
{ int i,j;
for(i=2;i<=L.length;++i)
if((L.data[i].key < L.data[i-1].key))
{
L.data[0]=L.data[i];//data[0]作为哨兵
L.data[i]=L.data[i-1];
j = i -1;
while( L.data[0].key < L.data[j].key )
{
L.data[j+1]=L.data[j];
j--;
}
L.data[j+1]=L.data[0]; //在此处插入数据
}
}
最后主函数
int main(void)
{
Sqlist l;//定义一个指针,该指针指向Sqlist结构
int i;//数组下标索引变量
int a[7] = {12,11,13,34,1,123,12};//待排序列
for(i = 1; i <= 7; i++)
{
l.data[i].key = a[i - 1];//data[0]留作哨兵不作排序
printf("%5d", l.data[i]);//指定宽度为5输出待排序列
}
printf("\n");//换行
l.length = i - 1;//数组长度为7
InsertSort(l);//调用插入排序算法
for(i = 1; i <= l.length; i++)
{
printf("%5d",l.data[i]);//输出排序后的数组
}
printf("\n");
return 1;
}
下面是完整的代码
#include "stdio.h"
#define MaxSize 100//最大排序100个数据
typedef int KeyType;
typedef int OtherType;//其他数据类型,这里不用
typedef struct
{
KeyType key; //相当于int key;
OtherType other;
}ElemType;
typedef struct
{
ElemType data[MaxSize + 1];
int length;
}Sqlist;//顺序表的形式
void InsertSort(Sqlist &L) //这里使用引用传递
{ int i,j;
for(i=2;i<=L.length;++i)
if((L.data[i].key < L.data[i-1].key))
{
L.data[0]=L.data[i];//data[0]作为哨兵
L.data[i]=L.data[i-1];
j = i -1;
while( L.data[0].key < L.data[j].key )
{
L.data[j+1]=L.data[j];
j--;
}
L.data[j+1]=L.data[0];//在此处插入数据
}
}
int main(void)
{
Sqlist l;//定义一个指针,该指针指向Sqlist结构
int i;//数组下标索引变量
int a[7] = {12,11,13,34,1,123,12};//待排序列
for(i = 1; i <= 7; i++)
{
l.data[i].key = a[i - 1];//data[0]留作哨兵不作排序
printf("%5d", l.data[i]);//指定宽度为5输出待排序列
}
printf("\n");//换行
l.length = i - 1;//数组长度为7
InsertSort(l);//调用插入排序算法
for(i = 1; i <= l.length; i++)
{
printf("%5d",l.data[i]);//输出排序后的数组
}
printf("\n");
return 1;
}
该程序在VC6.0++编译运行通过,我已经上传到csdn上,链接如下:
[http://download.csdn.net/detail/xiahangli1/8587395 ]大家有需要可以下载哈^_^
PS:如果对该算法有什么疑问或是哪里讲解不详细可以留言相互交流^_^