前面说了不少的排序算法了,今天有从书上看到了两个排序算法,这里准备把它们记录下来。今天写的两个排序算法是归并排序和基数排序
1、归并排序
在使用归并排序时,将两个或两个以上的有序表合并成一个新的有序表。假设初始序列含有 k 个记录,首先将 k 个记录看成 k 个有序的子序列,每个子序列的长度为1,然后两两进行归并,如此重复下去,直到长度为 k 为止,上述称为二路归并。
基本步骤:
①:将当前区间一分为二,求分裂点
②:递归地对两个子区间进行归并排序
③:将排好序的子区间归并为一个有序的区间
④:区间长度为1,递归条件终结
相关代码:
void merge(int a[], int start, int mid, int end) {
int n1 = mid - start + 1;
int n2 = end - mid;
int left[n1], right[n2];
// copy element
for (int i = 0; i < n1; ++i)
left[i] = a[start + i];
for (int j = 0; j < n2; ++j)
right[j] = a[mid + j + 1];
int i = 0, j = 0, k = start;
// compare left and right element, then decide which is big
while (i < n1 && j < n2) {
if (left[i] < right[j])
a[k++] = left[i++];
else
a[k++] = right[j++];
}
// copy element leave
// left[] is not exhausted
while (i < n1)
a[k++] = left[i++];
// right[] is not exhausted
while (j < n2)
a[k++] = right[j++];
}
void mergeSort(int a[], int start, int end) {
int mid;
if (start < end) {
mid = (start + end) / 2;
mergeSort(a, start, mid);
mergeSort(a, mid + 1, end);
merge(a, start, mid, end);
}
}
2、基数排序
前面的各种排序方法基本操作是比较和交换,而基数排序则利用分配和收集这两种基本操作。
基本思想:排序时先按照最低位的值对记录进行初步排序,在此基础上再按次低位的值进行进一步排序。依此类推,直至最高位。
#include<stdio.h>
typedef struct
{
int num;
int next;
}slcell; //静态链表的结点类型
#define M 11
int f[M];
int e[M];
int head=0;
void distribute(slcell *a,int w)
{
int i;
int last;
for(i=0;i<10;i++)
f[i]=-1;
for(i=head;i!=-1;i=a[i].next)
{
last=(a[i].num/w)%10;
if(f[last]==-1)
f[last]=i;
else
a[e[last]].next=i;
e[last]=i;
}
} //某一次排序
void collect(slcell *a)
{
int i;
int l = -1;
for (i=0; i<10; i++)
if (f[i] != -1)
{
if (l == -1)
head = f[i];
else
a[l].next = f[i];
l = e[i];
}
a[l].next = -1;
} //将排序好的数组恢复成静态链表
void Output(slcell *a, int head)
{
while (head != -1) {
printf("%4d", a[head].num);
head = a[head].next;
}
printf("n");
} //输出静态链表中的值

被折叠的 条评论
为什么被折叠?



