根据在排序过程中的主要操作,可分为四大类:
插入排序类:直接插入排序,希尔排序
选择排序类:简单选择排序,堆排序
交换排序类:冒泡排序,快速排序
归并排序类:归并排序
下面来说下他们的思想,就知道为什么事这四大类了:
插入排序类:都是对已经存在的记录进行移动,然后将某个记录插入相应的位置。
直接插入排序:是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。(直接插入排序,是对每个要插入的元素,都进行比较,觉得插入到某个位置)
#include <iostream>
using namespace std;
#define MAXSIZE 20
void insertSort(int a[],int len)
{
int i;
int j;
int tmp;
for (i=2; i<=len; i++)
{
if (a[i] < a[i-1])
{
tmp = a[i]; //tmp其实也就是哨兵,可以为a[0]
for (j=i-1; j>0&&a[j]>tmp ;j--) //这里要标明j>0,如序列为5 1 2 ,如果数组初始化为{0},则1>0,会终止。程序没有初始化为0,所以,需要加j>0,保证程序正确。从这里可以看出,初始化多么的重要。要符合编程规范!
{
a[j+1]=a[j];
}
a[j+1]=tmp;
}
}
for (i=1; i<=len; i++)
{
cout<<a[i]<<endl;
}
}
int main()
{
int arr[MAXSIZE];
int n;
int i;
cout<<"输入数据的个数"<<endl;
cin>>n;
cout<<"输入数据:"<<endl;
for(i=1; i<=n; i++)
{
cin>> arr[i];
}
insertSort(arr, n);
return 0;
}
直接插入排序是希尔排序的一个特例。因为,在使用直接插入排序,一般是要求,记录本身是基本有序的,还有就是记录数比较少,直接插入的优势才比较明显。
那么希尔排序的思想是根据这些要求提出来的。将大量的数据进行分组,分割成若干个子序列,此时每个子序列中待排记录数就比较少。采用的分割策略就是,将相距某个“增量”的记录组成一个子序列。对这些中的子序列中记录进行排序。
所谓基本有序,就是小的关键字基本在前面,大的关键字基本在后面。下节将讲述希尔排序的实现。