排序算法总结

本文详细介绍了多种排序算法的实现,包括冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序和快速排序等。每种算法都有详细的解释及其实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述
下面是算法实现,对于堆排序没有怎么调试,其他的都调试过了

#include <stdio.h>

#define maxsize 10

typedef enum
{
    true = 1,
    false = 0
}Status;

typedef struct
{
    int r[maxsize];
}Sqlist;


void swap(Sqlist *L, int i, int j);

void data_get(Sqlist *L);
void data_print(Sqlist *L);

void bubble_sort0(Sqlist *L);
void bubble_sort1(Sqlist *L);
void bubble_sort2(Sqlist *L);

void select_sort(Sqlist *L);
void insert_sort(Sqlist *L);
void shell_sort(Sqlist *L);

void Heapsort(Sqlist *L);
void HeapAdjust(Sqlist *L, int m, int n);


void Merge_Sort(Sqlist *L);
void M_Sort(int SR[], int TR1[], int s, int t);
void Merge(int SR[], int TR[], int i, int m, int n);


void Quicksort(Sqlist *L);
void QSort(Sqlist *L, int low, int high);
int Partion(Sqlist *L, int low, int high);



int main( )
{
    Sqlist L;

    data_get(&L);

    Merge_Sort(&L);

    data_print(&L);

    return 0;
}

/**********************************交换排序*****************************************/

/*
    交换排序的基本思想是:两两比较相邻记录的关键字,
    如果反序则交换,直到没有反序为止。
*/

void bubble_sort0(Sqlist *L)
{
    int i, j;
    for(i=0; i<maxsize; i++)
        for(j=i; j<maxsize; j++)
        {
            if(L->r[i] > L->r[j])
                swap(L, i, j);
        }
}

/**********************************冒泡排序****************************************/

/*
    冒泡排序的基本思想是:第二层循环 j-1和j做对比,
    大则交换,也就是临近的两两做交换
*/
void bubble_sort1(Sqlist *L)
{
    int i, j;

    for(i=0; i<(maxsize-1); i++)
        for(j=0; j<(maxsize-1-i); j++)
        {
            if(L->r[j] > L->r[j+1])
                swap(L, j+1, j);
        }
}

/*
冒泡排序改进:几乎与上面的相同,主要目的是除去多余的遍历操作,
也就是说发现,已经排好序了,就不需要后面的遍历了
*/
void bubble_sort2(Sqlist *L)
{
    int i, j;

    Status flag = true;

    for(i=1; i<maxsize && flag; i++)
    {
        for(j=maxsize-1; j>=i; j--)
        {
            flag =false;
            if(L->r[j-1] > L->r[j])
            {
                swap(L, j-1, j);
                flag = true;            
            }
        }
    }
}

/**********************************简单选择排序*************************************/
/*
    简单选择排序的基本思想是:通过n-i次关键字间的比较,
    从n-i+1个记录中选出关键字最小的记录,   并和第i个记录交换。
*/
void select_sort(Sqlist *L)
{
    int i, j;
    int min;
    for(i=0; i<maxsize; i++)
    {
        min = i;
        for(j=i; j<maxsize; j++)
        {
            if(L->r[min] > L->r[j])
                min=j;
        }
        if(i != min)
            swap(L, i, min);
    }
}

/**********************************直接插入排序************************************/
/*
    直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,
    从而得到一个新的记录数增1的有序表。
*/
void insert_sort(Sqlist *L)
{
    int i, j;
    int temp;

    for(i=1; i<maxsize; i++)
    {
        if(L->r[i] < L->r[i-1])
        {
            temp = L->r[i];
            for(j=i-1; (temp<L->r[j])&&(j>=0); j--)
            {
                L->r[j+1] = L->r[j];
            }
            L->r[j+1] = temp;
        }
    }   
}

/**********************************希尔排序************************************/
/*
    希尔排序的基本思想是,将序列排的基本有序,就是小的关键字
    基本在前面,大的基本在后面,不大不小的在中间。
*/

void shell_sort(Sqlist *L)
{
    int i, j;
    int temp;
    int increment = maxsize;
    do
    {
        increment = increment/3+1;
        for(i=increment; i<maxsize; i++)
        {
            if( L->r[i] < L->r[i-increment] )
            {
                temp = L->r[i];

                for(j=i-increment; (j>=0)&&(temp < L->r[j]); j-=increment)
                    L->r[j+increment] = L->r[j];

                L->r[j+increment] = temp;
            }
        }
    }while(increment>1);
}

/**********************************堆排序***************************************/

/*
    堆排序就是利用堆进行排序的方法,它的基本思想是,将待排序的
    序列构造成一个大顶堆。此时,  整个序列的最大值就是堆顶的
    根结点。将它移走(其实就是将其余堆数组的末尾元素交换,此时
这样就得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。
*/
void Heapsort(Sqlist *L)
{
    int i;

    for(i=maxsize/2; i>=1; i--)
        HeapAdjust(L, i, maxsize);

    for(i=maxsize; i>1 ; i--)
    {
        swap(L, 1, i-1);
        HeapAdjust(L, 1, i-1);
    }
}

void HeapAdjust(Sqlist *L, int m, int n)
{
    int j;
    int temp;

    temp = L->r[m-1];

    for( j=2*m; j<=n; j*=2 )
    {
        if(j<n && L->r[j-1]<L->r[j])
            j--;

        if(temp >= L->r[j-1])
            break;

        L->r[m] = L->r[j];
        m = j;
    }

    L->r[m] = temp;
}

/**********************************归并排序***********************************/
/*
    归并排序就是利用归并的思想实现的排序方法,它的原理就是
    设初始序列包含有n个记录,则可以    看成是n个有序的子序
    列,每个子序列的长度为1,然后两两归并,得到n/2个
    长度为2或1的有序子  序列,并且两两归并。
*/
void Merge_Sort(Sqlist *L)
{
    int i=1;
    M_Sort(L->r, L->r, 0, maxsize-1);
}

void M_Sort(int SR[], int TR1[], int s, int t)
{
    int m;
    int TR2[maxsize];

    if(s == t)
        TR1[s] = SR[s];
    else
    {
        m = (s+t)/2;
        M_Sort(SR, TR2, s, m);
        M_Sort(SR, TR2, m+1, t);
        Merge(TR2, TR1, s, m, t);
    }
}

void Merge(int SR[], int TR[], int i, int m, int n)
{
    int j, k, l;

    for(j=m+1, k=i; i<=m && j<=n; k++)
    {
        if (SR[i]<SR[j])
            TR[k] = SR[i++];
        else
            TR[k] = SR[j++];
    }

    if(i<=m)
    {
        for(l=0; l<=m-i; l++)
        {
            TR[k+l] = SR[i+l];
        }
    }

    if(j<=n)
    {
        for(l=0; l<=n-j; l++)
            TR[k+l] = SR[j+l];
    }
}


/**********************************快速排序**********************************/
/*
    快速排序的基本思想是:通过一趟排序将待排记录
    分割成独立的两个部分,其中一部分记录的关键字
    均比另外一部分的关键字小,则可分别记录继续
    进行排序,以达到整个序列有序的目的。
*/

void Quicksort(Sqlist *L)
{
    QSort(L, 0, maxsize-1);
}

void QSort(Sqlist *L, int low, int high)    //序列分割
{
    int pivot;
    if(low < high)
    {
        pivot = Partion(L, low, high);
        QSort(L, low, pivot-1);
        QSort(L, pivot+1, high);
    }
}

int Partion(Sqlist *L, int low, int high) //
//将关键字两端进行关键字排序
{
    int pivotkey;

    pivotkey = L->r[low];

    while(low < high)
    {
        while(low < high && L->r[high] >= pivotkey)
            high--;
        swap(L, low, high);

        while(low < high && L->r[low] <= pivotkey)
            low++;
        swap(L, low, high);
    }

    return low;
}



/**********************************辅助操作函数*****************************/
/*数据输入函数*/
void data_get(Sqlist *L)
{
    int i;
    printf("*****请输入需要排序的十个数字:*****\n");

    for(i=0; i<maxsize; i++)
        scanf_s("%d",&(L->r[i]));

    printf("\n");
    printf("*****您输入的十个数字依次为:*****\n");

    for(i=0; i<maxsize; i++)
        printf("%d ",L->r[i]);

    printf("\n\n");
}

/*数据打印函数*/
void data_print(Sqlist *L)
{
    int i;

    printf("*****排序后的十个数字为:********\n");

    for(i=0; i<maxsize; i++)
        printf("%d ",L->r[i]);

    printf("\n\n");
}

/**********两个数据交换***********/
void swap(Sqlist *L, int i, int j)
{
    int temp = L->r[i];
    L->r[i] = L->r[j];
    L->r[j] = temp;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值