一. 排序的基本概念
1. 排序的分类
2. 具体的的解析
-
什么是稳定性?
假设 Ki = Kj ( 1<= i <=n, 1<= j <=n ,i≠j),且在排序浅的序列中 ri 领先于rj (即 i < j)。如果排序后 ri 仍领先于 rj,则称所用的排序方法是最稳定的;反之,若可能使得排序后的序列中 rj 领先于 ri 则称所用的排序方法是不稳定的。 -
按存储介质分为
- 内部排序:数据量不大,数据在内存,无需内外存交换数据------内排序又分为:插入排序,交换排序,选择排序,归并排序
- 外部排序:数据量较大,数据在外存(文件排序)----- 由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行。
- 按比较器个数分为
- 串行排序:单处理机(同一时刻比较一对元素)
- 并行排序:多处理机(同一时刻比较多对元素)
二. 简单的排序实现
由于排序中最常用到元素交换,为了方便,我们将它写为函数
void swap(int r,int i,int j)
{
int temp = r[i];
r[i] = r[j];
r[j] = temp;
}
1. 冒泡排序
void BubbleSort1(int *r,int lenth)
{
int i,j;
for(i = 0;i < length-1;i++)
{
for (j = 0;j < length-1-i; j++)
{
if(r[j] > [j+1])
{
swap(r,j,j+1);
}
}
}
}
2. 简单的选择排序
void SelectSort(int *r,int lenth)
{
int i, j;
for (i = 0; i < length-1; i++)
{
for (j = i + 1; j < length; j++)
{
if (r[i] > r[j])
{
swap(r, i, min);
}
}
}
}
3. 插入排序
将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数加一的有序表。例如:整理扑克牌
- 直接插入排序
采用顺序查找法查找插入位置
使用哨兵
// r[0] 为哨兵
//如果这个元素比它前面一个元素要小,那么就用 0 号元素记录这个值,从前一个元素开始,不断的与 0 号元素比较
void InsertSort1(int *r,int length)
{
int i,j;
for(i = 2;i < = n;i++) //从第二个元素开始
{
if(r[i] < r[i-1]) //若要插入的元素已经比前一个大就直接放在最后
{
r[0] = r[i]; //记录i处的值
for(j=i-1;r[j] > r[0];j--)
{
r[j + 1] = r[j]; //数据不断后移
}
r[j + 1] = r[0]; //插入正确位置
}
}
}
- 折半插入排序
void InsertSort2(int *r,int length)
{
int i,j;
int low,high,mid;
for(i = 2;i < = n;i++) //从第二个元素开始
{
r[0] = r[i];
low = 1;
high = i-1;
while(low <= high)
{
mid = (low + high)/2;
if(r[0] < mid)
{
high = mid-1;
}
else
{
low = mid+1;
}
}//循环结束,high+1 为插入位置
for(j=i-1;j>=high+1;j--)
{
r[j+1] = r[j]; //向后移动元素,将r[high+1]空出来
}
r[high+1] = r[0]; //插入到正确位置
}
}