数据结构实验-排序算法的应用

该博客详细介绍了几种常见的排序算法,包括直接插入排序、冒泡排序、快速排序(两种实现方式)、堆排序和归并排序。每种算法都有具体的代码实现,并在主函数中应用于随机生成的整数序列。此外,还提出了使用折半查找改进插入排序的选做题。博客旨在帮助读者理解和应用不同排序算法,以及分析其时间复杂度。
摘要由CSDN通过智能技术生成

目录

题目

(1)实验要求:

(2)实验内容:

顺序表的创建和初始化函数

直接插入排序算法

冒泡排序

快排 

快速排序(课本上的快速排序)

另一种快排方法(非课本方法)

 堆排序

归并排序

主函数输入部分 

输出部分可以根据一下样例进行编写


题目

(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;

仅供参考,严谨抄袭。顺序存储定义过程和课本稍有出入。选做部分没有写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值