您的位置:首页 > 其它

排序算法之插入排序和交换排序

2015-09-27 22:09 239 查看
排序就是将一组对象按照规定的次序重新排列的过程,排序往往是为检索服务的。排序算法有很多,很难确定一种公认的最好的方法,没种排序都有适合的不同情况,在实际应用中选择适当的方法。

插入排序

直接插入排序

直接插入排序是一种简单的排序方法,它的基本思想是依次将每个记录插入到一个已排好序的有序表中去,从而得到一个新的、记录数增加1的有序表。

代码如下

<span style="font-size:18px;">void StraightInsertSort(List R,int n)
{
for (i=2;i<=n;i++)				//n为表长,从第二个记录起进行插入
{
R[0]=R[i];					//第i个记录复制为岗哨
j=i-1;
while(R[0].key<R[j].key)		//与岗哨比较,直至键值不大于岗哨键值
{
R[j+1]=R[j];			//将第j个记录赋值给第j+1个记录
j--;
}
R[j+1]=R[0];				//将第i个记录插入到序列中
}
}
</span>


直接排序的算法简单,容易理解,容易实现,时间复杂度为O(n²),直接排序算法是稳定的。

交换排序

冒泡排序

冒泡排序法是一种交换排序方法,其过程是首先将第一个记录的键值和第二个记录的键值进行比较,若为逆序,则将这两个记录交换,然后继续比较第二个和第三个记录的键值。

 

代码如下

<span style="font-size:18px;">void BubbleSort(List R,int n)
{
int I,j,temp,endsort;
for(i=1;i<=n-1;i++)
{
endsort=0;
for(j=1;j<=n-i-1;j++)
{
if(R[j].key>R[j+1].key)
{
temp=R[j];
R[j]=R[j+1];
R[j+1]=temp;
endsort=1;
}
}
if(endsort ==0 )
{
<span style="white-space:pre"> </span>break;
}
}
}
</span>

冒泡排序为稳定的排序算法,时间复杂度为O(n²)。

快速排序

快速排序是交换排序的一种,实质上是对冒泡排序的一种改进。它的进本思想:在n个记录中取某一个记录的键值为标准,通常取第一个记录键值为基准,通过一趟排序将待排序的记录分为小于或等于这个键值和大于这个键值的两个独立的部分,这时一部分的记录键值均比另一部分记录的键值小,然后,对这两部分记录继续分别进行快速排序,以达到整个序列有序。

 

代码如下:

<span style="font-size:18px;">int QuickPartition(List R,int low,int high)
{
//对R[low],R[low+1],…R[high]子序列进行一趟快速排序
x=R[low]; //置初值
while(low<high)
{
while(low<high) && (R[high].key>=x.key)
{
high--;
}
R[low]=R[high];
while((low<high) && (R[low].key<=x.key))
{
low++;
}
R[high]=R[low];
}
R[low]=x;
return low;
}

void QuickSort(List R,int low,int high)
//对记录序列R[low],R[low+1],…R[high]进行快速排序
{
if(low<high)
{
temp=QuickPartition(R,low,high);
QuickSort(R,low,temp-1);
QuickSort(R,temp+1,high);
}
}</span>
就平均时间性能而言,快速排序方法最佳,其时间复杂度为O(nlog(2)n)。但在最坏的情况下,即对几乎已是安排好序的输入序列,该算法的效率较低,近似于O(n²)。另外,对于较小的n值该算法效果不明显;反之,对较大的n值效果较好。

以上是对插入排序和交换排序的总结,下一篇会对选择排序和归并排序进行总结。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息