约定待排序的记录的数据结构为:
typedef struct
{
int key;
elemtype data;
} redtype;
redtype r[n];
一、插入排序
1.直接插入排序
基本思路:依次把待排序的记录逐一按其关键字的大小插入到一个已经排好序的有序序列中去,直到所有的记录插完为止,得到一个新的有序序列。
void direct_insert(redtype r[ ], int n)
{
int i, j;
for ( i = 2; i <=n; i ++) {
r[0] = r[i];
j = i - 1;
while(r[0].key < r[j].key) {
r[j + 1] = r[j];
j --;
}
r[j + 1] = r[0];
}
}
结果:稳定排序,时间复杂度O(n方),空间复杂度O(1)
2.希尔排序(缩小增量排序)
说明:也是一种插入排序类的算法,不稳定排序,但在时间效率上有较大的改进。
基本思路:选定第一个增量d1 < n,把全部记录按此值从第一个记录起进行分组,所有相距为d1的记录作为一组,先在各组内进行插入排序,然后减小间隔,取第二个增量d2<d1,重复上述分组和排序过程,直至增量值di=1为止,即所有的记录放在同一组内排序。
对于每一趟的增量di可以有多种取法。希尔提出的取法是:d1=n/2,di+1=di/2
void shell_sort(redtype r[ ], int n)
{
redtype x;
int i,j,d;
d = n/2;
while(d >=1) {
for(i = d + 1; i <= n; i ++) {
x = r[i];
j = i - d;
while( j > 0; && x.key < r[j].key) {
r[j + d] = r[j];
j = j - d;
}
r[j + d] = x;
}
d = d / 2;
}
}
3.冒泡排序
void bubble_sort(redtype r[],int n)
{
int i,j,k;
redtype x;
k=1;
i=1;
while(i<n&&k>0){
k=0;
for(j=0;j<n-i;j++){
if(r[j+1].key<r[j].key){
k++;
x=r[j+1];
r[j+1]=r[j];
r[j]=x;
}
}
i++;
}
}
4.快速排序
void quick_sort(redtype r[],int low,int high)
{
int i,j,k;
redtype x;
if(low < high){
i=low;
j=high;
x=r[i];
while(i < j){
while(r[j].key>=x.key&&i<j) j--;
if(i < j){
r[i]=r[j];
i++;
}
while(r[i].key<=x.key && i<j) i++;
if(i<j){
r[j]=r[i];
j--;
}
}
r[i]=x;
quick_sort(r,low,j-1);
quick_sort(r,j+1,high);
}
}
5.简单选择排序
void selection_sort(redtype r[ ],int n)
{
int i,j,k,t;
for(i = 0; i < n; i++){
k = i;
for(j = i + 1; j < n; j++) {
if(r[j].key < r[k].key) {
k = j;
}
}
if(k != i) {
t = r[k];
r[k]=r[i];
r[i]=t;
}
}
}