排序算法汇总
2015-09-28 22:23
197 查看
排序是计算机数据处理中很重要的也很常见的运算,排序操作在处理过程中会占用很多时间,为提高计算机运行效率,人们提出了不断改进各种各样的计算机算法。
【算法汇总】
按照待排序数据的存放位置可以将排序分为内部存储(内存)和外部存储(外存)两大类:
稳定性和算法的时间复杂度是评判算法优劣的两个依据:
稳定性:相同键值的两个记录在排序前后相对位置的变化情况,如果位置改变为不稳定,反之稳定。
排序算法的时间复杂度可以从键值的比较次数和记录的移动次数两个方面进行分析 :
【类C语言代码】
1. 排序算法要把待排序的信息用存储结构代码储存起来:
typedef struct //结构体数据类型可以放不同数据类型的数据
{
int key; //价值项--排序依据
ItemType Otheritem;//其他内容项目
}RecordType
typedef RecordType List[n+1];//n序列中带排序记录的总数,<span style="font-size:18px;"> list变量第0个记录用于暂存某个记录值(“岗哨”)或者搁置不用</span>
2. 直接插入算法:
Void StraightInsertSort(List R,int n)
{
Int I,j
For(i=2;i<=n;i++) //从第2个记录起进行插入
{
R[0]=R[i]; //第i个记录复制为岗哨
j=i-1;
while(R[0].key<R[j].key) //与岗哨比较,键值不大于岗哨键值
{
R[j+1]=R[j];
j--;
}
R[j+1]=R[0];
}
}
3. 冒泡排序
Void BubbleSort(List R,int n)
{
Int I,j,temp,endsort;
For(i=1;j<=n-1;i++)
{
Ensort=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(ensort==0);break;
}
}
4. 快速排序
完成一轮交换:
Int QuickPartition(List R,int low,int high)
{
X=R(low);
While(low<high)
{
While((low<high)&&(R[high].key>=x.key)) high--;
R[low]=R[high];
While((low<high)&&(R[high].key<=x.key))) low++;
R[high]=R[low];
}
R[low]=x;
Return low;
}
利用迭代器完成所有交换:
Void QuickSort(list R,int low,int high)
{
If(low<high)
{
Temp=QuickPartition(R,low,high); //分成两拨再进行排序
QuickSort(R,low,temp-1);
QuickSort(R,temp+1,high);
}
}
【总结】
在这些例题中,相对困难的是对算法的理性认识抽象为代码的过程:首先我们要理解待排序数据的内部组成部分,然后判定数组是否需要定义最大存储量,数组的下标从哪里开始存放数值。
【算法汇总】
按照待排序数据的存放位置可以将排序分为内部存储(内存)和外部存储(外存)两大类:
稳定性和算法的时间复杂度是评判算法优劣的两个依据:
稳定性:相同键值的两个记录在排序前后相对位置的变化情况,如果位置改变为不稳定,反之稳定。
排序算法的时间复杂度可以从键值的比较次数和记录的移动次数两个方面进行分析 :
【类C语言代码】
1. 排序算法要把待排序的信息用存储结构代码储存起来:
typedef struct //结构体数据类型可以放不同数据类型的数据
{
int key; //价值项--排序依据
ItemType Otheritem;//其他内容项目
}RecordType
typedef RecordType List[n+1];//n序列中带排序记录的总数,<span style="font-size:18px;"> list变量第0个记录用于暂存某个记录值(“岗哨”)或者搁置不用</span>
2. 直接插入算法:
Void StraightInsertSort(List R,int n)
{
Int I,j
For(i=2;i<=n;i++) //从第2个记录起进行插入
{
R[0]=R[i]; //第i个记录复制为岗哨
j=i-1;
while(R[0].key<R[j].key) //与岗哨比较,键值不大于岗哨键值
{
R[j+1]=R[j];
j--;
}
R[j+1]=R[0];
}
}
3. 冒泡排序
Void BubbleSort(List R,int n)
{
Int I,j,temp,endsort;
For(i=1;j<=n-1;i++)
{
Ensort=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(ensort==0);break;
}
}
4. 快速排序
完成一轮交换:
Int QuickPartition(List R,int low,int high)
{
X=R(low);
While(low<high)
{
While((low<high)&&(R[high].key>=x.key)) high--;
R[low]=R[high];
While((low<high)&&(R[high].key<=x.key))) low++;
R[high]=R[low];
}
R[low]=x;
Return low;
}
利用迭代器完成所有交换:
Void QuickSort(list R,int low,int high)
{
If(low<high)
{
Temp=QuickPartition(R,low,high); //分成两拨再进行排序
QuickSort(R,low,temp-1);
QuickSort(R,temp+1,high);
}
}
【总结】
在这些例题中,相对困难的是对算法的理性认识抽象为代码的过程:首先我们要理解待排序数据的内部组成部分,然后判定数组是否需要定义最大存储量,数组的下标从哪里开始存放数值。
相关文章推荐
- JavaScript演示排序算法
- 算法之排序算法的算法思想和使用场景总结
- php 地区分类排序算法
- js三种排序算法分享
- Javascript中的常见排序算法
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
- 排序算法的javascript实现与讲解(99js手记)
- C++中十种内部排序算法的比较分析
- Java实现几种常见排序算法代码
- 浅谈javascript实现八大排序
- PHP常用的排序和查找算法
- JavaScript中九种常用排序算法
- STl中的排序算法详细解析
- PHP四种基本排序算法示例
- 排序算法之PHP版快速排序、冒泡排序
- JavaScript排序算法之希尔排序的2个实例
- Java常用排序算法及性能测试集合
- Java中常用的6种排序算法详细分解
- Javascript排序算法之合并排序(归并排序)的2个例子
- JAVA简单选择排序算法原理及实现