基本排序算法小结 (一)

2014-11-24 00:43:51 · 作者: · 浏览: 6

一、插入排序

1 排序思想

将待排序的记录Ri,插入到已排好序的记录表R1, R2 ,…., Ri-1中,得到一个新的、记录数增加1的有序表。 直到所有的记录都插入完为止。复杂度为O(n2) 。

设待排序的记录顺序存放在数组R[1…n]中,在排序的某一时刻,将记录序列分成两部分:

◆ R[1…i-1]:已排好序的有序部分;

◆ R[i…n]:未排好序的无序部分。

显然,在刚开始排序时,R[1]是已经排好序的。

例:设有关键字序列为:7, 4, -2, 19, 13, 6,直接插入排序的过程如下图所示:

\

代码如下:

//直接插入排序


[cpp]

void straight_insert_sort(int *L,intlength)
{
inti, j,temp ;
for(i=1; i<=length; i++)
{
temp=L[i];
j=i-1; /* 设置哨兵 */
while(temp { L[j+1]=L[j];
j--;
} /* 查找插入位置 */
L[j+1]=temp; /* 插入到相应位置 */
}
}

void straight_insert_sort(int *L,intlength)
{
inti, j,temp ;
for(i=1; i<=length; i++)
{
temp=L[i];
j=i-1; /* 设置哨兵 */
while(temp { L[j+1]=L[j];
j--;
} /* 查找插入位置 */
L[j+1]=temp; /* 插入到相应位置 */
}
}

二、 选择排序

最简单的排序算法,过程如下:选出数组中最小的元素,将它与数组中第一个元素交换。然后找出次小的元素,将它与数组中第二个元素交换,一直持续下去,直到整个数组排序结束。之所叫选择排序,是因为它不断选出剩余元素中的最小元素来实现。

实现代码如下:


[cpp]
oid selection(Item a[],int l,int r)
{
int i,j;
for(i=l;i {
intmin=i;//最小元素索引
for(j=i+1;j<=r;j++)
{
if(less(a[j]),a[min])
{
min=j;//更新最小元素的索引值
}
}
exch(a[i],a[min]);//交换
}

}

void selection(Item a[],int l,int r)
{
int i,j;
for(i=l;i {
intmin=i;//最小元素索引
for(j=i+1;j<=r;j++)
{
if(less(a[j]),a[min])
{
min=j;//更新最小元素的索引值
}
}
exch(a[i],a[min]);//交换
}

}

选择排序的执行时间由比较操作的数目决定,所使用的次数大概是

:比较操作次数N*N/2,交换操作次数是 N次。而且选择排序的时间消耗与当前序列的排序状态无关。

三、 希尔排序

希尔排序时插入排序的扩展,他通过允许非相邻的元素进行交换来提高执行效率。希尔排序的本质:h-排序,是每第h个元素产生一个排序好的文件。h-排序的文件时h个独立的已排序好的文件,相互交叉在一起。对h值较大的h排序文件,可以移动相距较远的元素,比较容易的使h值较小时进行h排序,通过直到1的h值的排序,产生有序文件。


[cpp]
void hell(int *data,int left,int right)
{
intlen=right-left+1;
intd=len;
while(d>1)
{
d=(d+1)/2;
for(int i=left;i {
if(data[i+d] {
inttmp=data[i+d];
data[i+d]=data[i];
data[i]=tmp;
}
}
}
}

void hell(int *data,int left,int right)
{
intlen=right-left+1;
intd=len;
while(d>1)
{
d=(d+1)/2;
for(int i=left;i {
if(data[i+d] {
inttmp=data[i+d];
data[i+d]=data[i];
data[i]=tmp;
}
}
}
}

希尔排序要选择一个比较好的步长序列。

四、 冒泡排序

冒泡排序很简单:遍历文件,如果紧邻的两个元素顺序不对,就将两者交换,重复这个操作,直到整个序列排好序。对于l~r-1的i值,内部循环j通过从右到左遍历元素,对连续的元素执行比较—交换操作,实现将a[i],…a[r]中最小的元素放大a[i]中。在所有的比较操作中,最小的元素都要移动,冒到最前端。


[cpp]
void maopao(Item a[],int l,int r)
{
inti,j;
for(i=l;i {
for(j=r;j>i;j--)
{
if(less(a[j],a[j-1]))
{
Itemtemp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
}