目录
题目
(1)实验要求:
掌握常用的排序方法及其实现方法;深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用;了解各种方法的排序过程及其依据的原则,并掌握各种排序方法的时间复杂度的分析方法。
(2)实验内容:
必做:随机产生一组m到n之间的一组整数,对这一组整数编写常用的排序函数:直接插入排序、冒泡排序、快速排序、堆排序、归并排序。
具体要求:在主调函数中产生一组整数,并根据不同的选择采用不同的排序方法对其进行排序,并输出排序结果。
选作:直接插入排序中寻找插入位置的操作可以通过折半查找来实现。据此写一个改进的插入排序的算法。
根据各排序算法进行函数的书写,然后根据传入顺序表进行排序,最后遍历输出即可。代码过程稍有啰嗦。
顺序表的创建和初始化函数
#define ListInitSize 100//初始时线性表的内存
#define ListIncerment 10//当内存不足时追加的内存
typedef struct
{
int *base;
int length;
int listsize;
}SqList;
SqList L1,L2,L3,L4,L5,T;//L12345是用来排序的,T是堆排序中的中间表
//初始化操作
void InitSqList(SqList &L)
{
L.base = (int*)malloc(ListInitSize*sizeof(int));
if(!L.base){
cout << "分配失败";
return ;
}
L.length = 0;
L.listsize = ListInitSize;
}
直接插入排序算法
//直接插入排序
void sort_zjcr(SqList &L)
{
for(int i = 2;i <= L.length;i++){
if(L.base[i] < L.base[i-1]){
L.base[0] = L.base[i];
L.base[i] = L.base[i-1];
int j;
for(j = i-2;L.base[0] < L.base[j];j--){
L.base[j+1] = L.base[j];
}
L.base[j+1] = L.base[0];
}
}
}
冒泡排序
//冒泡排序
void sort_mp(SqList &L)
{
bool flag = 1;
for(int i = 1;i < L.length && flag;i++){
flag = 0;
for(int j = 1;j <= L.length-i;j++){
if(L.base[j] > L.base[j+1]){
L.base[0] = L.base[j];
L.base[j] = L.base[j+1];
L.base[j+1] = L.base[0];
flag = 1;
}
}
}
}
快排
快速排序(课本上的快速排序)
//快排
int Partiton(SqList &L,int low,int high)
{
L.base[0] = L.base[low];
int pivotkey = L.base[low];
while(low < high){
while(low < high && L.base[high] >= pivotkey)
high--;
if(low < high)
L.base[low++] = L.base[high];
while(low < high && L.base[low <= pivotkey])
low++;
if(low < high)
L.base[high--] = L.base[low];
}
L.base[low] = L.base[0];
return low;
}
void QSort(SqList &L,int low,int high)
{
if(low < high){
int pivotloc = Partiton(L,low,high);
QSort(L,low,pivotloc);
QSort(L,pivotloc+1,high);
}
}
void sort_kp(SqList &L)
{
QSort(L,1,L.length);
}
另一种快排方法(非课本方法)
void quick_sort(SqList &L, int l, int r)
{
if (l >= r)
return;
int i = l - 1, j = r + 1, x = L.base[l + r >> 1];
while (i < j)
{
do i++; while (L.base[i] < x);
do j--; while (L.base[j] > x);
if (i < j)
swap(L.base[i], L.base[j]);
}
quick_sort(L, l, j);
quick_sort(L, j + 1, r);
}
堆排序
void HeapAdjust(SqList &L,int s,int m)
{
L.base[0] = L.base[s];
for(int j = 2*s;j <= m;j *= 2){
if(j < m && L.base[j] < L.base[j+1])
j++;
if(L.base[0] >= L.base[j])
break;
L.base[s] = L.base[j];
s = j;
}
L.base[s] = L.base[0];
}
void HeapSort(SqList &L)
{
for(int i = L.length/2;i > 0;i--){
HeapAdjust(L,i,L.length);
}
for(int i = L.length;i > 1;i--){
swap(L.base[1],L.base[i]);
HeapAdjust(L,1,i-1);
}
}
归并排序
void Merge(SqList &L,int s,int m,int n)
{
int i = s;
int j = m+1;
int k = 0;
while(i <= m && j <= n)
if(L.base[i] <= L.base[j])
T.base[k++] = L.base[i++];
else
T.base[k++] = L.base[j++];
while(i <= m)
T.base[k++] = L.base[i++];
while(j <= n)
T.base[k++] = L.base[j++];
for(i = s;i <= n;i++){
L.base[i] = T.base[i-s];
}
}
void MSort(SqList &L,int low,int high)
{
if(low < high){
int mid = (low+high)/2;
MSort(L,low,mid);
MSort(L,mid+1,high);
Merge(L,low,mid,high);
}
}
void MergeSort(SqList &L)
{
MSort(L,1,L.length);
}
主函数输入部分
srand(unsigned(time(0)));//用系统时间做伪随机数种子
int n;
cout << "请输入需要插入元素的个数:";
cin >> n;
int x,y;
cout << "请输入需要限制的元素范围m和n:";
cin >> x >> y;
if(x > y)
swap(x,y);
for(int i = 1;i <= n;i++){
int a = rand() % (y-x) + x;
L1.base[i] = a;
L2.base[i] = a;
L3.base[i] = a;
L4.base[i] = a;
L5.base[i] = a;
L1.length++;
L2.length++;
L3.length++;
L4.length++;
L5.length++;
cout << a << " ";
}
输出部分可以根据一下样例进行编写
cout << "直接插入排序:"<< endl;
sort_zjcr(L1);
for(int i = 1;i <= L1.length;i++){
cout << L1.base[i] << " ";
}
cout << endl;
仅供参考,严谨抄袭。顺序存储定义过程和课本稍有出入。选做部分没有写。