1.实验目的
(1)掌握插入排序算法(重点掌握直接插入排序)及其特点;
(2)掌握快速排序算法及其特点;
(3)掌握归并排序算法及其特点;
2.实验要求
采用顺序存储结构,完成顺序表的创建,实现对顺序表的直接插入排序、冒泡排序。
3.实验代码
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
#define FALSE 0
#define TRUE 1
typedef int KeyType;
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
typedef struct
{
KeyType key;
}RcdType;
typedef struct
{
RcdType r[MAXSIZE+1];//r[0]闲置或用作哨兵
int length;
}Sqlist;
typedef RcdType ElemType;
int Create(Sqlist &L)
{
int i,n;
printf("请输入数据的个数:\n");
scanf("%d",&n);
printf("请输入各数据:\n");
for(i = 1;i <= n;i++)
{
scanf("%d", &L.r[i].key);
}
L.length = n;
return 1;
}
void InsertSort(Sqlist &L)
{
int i,j;
for(i = 2;i <= L.length;++i)
if(LT(L.r [i].key,L.r[i-1].key))
{
L.r [0] = L.r [i];//L.r[0]为监视哨
for(j = i - 1;LT(L.r[0].key,L.r[j].key);--j)
L.r [j + 1] = L.r [j];
L.r [j + 1] = L.r [0];
}
for(int i = 1;i <= L.length;i++)
{
printf("%d ", L.r[i].key);
}
}
void BubbleSort(Sqlist &L)
{
for(int i = L.length ,change = TRUE;i > 1&&change;--i)
{
change = FALSE;
for(int j = 1;j < i;++j)
if(LT(L.r [j+1].key,L.r [j].key))
{
ElemType temp = L.r[j];
L.r[j] = L.r[j + 1];
L.r[j+1] = temp;
change = TRUE;
}
}
for(int i = 1;i <= L.length ;i++)
{
printf("%d ", L.r[i].key);
}
}
void Print(Sqlist L) {
for (int i = 1;i <= L.length;i++)
printf("%d ", L.r[i].key);
printf("\n\n");
}
int Patition(Sqlist &L,int low,int high){
L.r[0] = L.r[low];
int pivotkey = L.r[low].key;
while(low < high)
{
while(low < high&&L.r[high].key >= pivotkey)
--high;
L.r[low] = L.r[high];
while(low < high&&L.r[low].key <= pivotkey)
++low;
L.r[high] = L.r[low];
}
L.r[low] = L.r[0];
return low;
}
void QSort(Sqlist &L, int low, int high) {
if(low < high)
{
int pivotloc = Patition(L,low,high);
QSort(L,low,pivotloc - 1);
QSort(L,pivotloc+1,high);
}
}
void QuickSort(Sqlist &L){
QSort(L, 1, L.length);
Print(L);
}
int main()
{
Sqlist L;
Create(L);
printf("对顺序表的直接插入排序结果为:\n");
InsertSort(L);
printf("\n对顺序表的冒泡排序结果为:\n");
BubbleSort(L);
printf("\n对顺序表的快速排序结果为:\n");
QuickSort(L);
system("pause");
return 0;
}