数据结构常用的七种排序算法总结

前言

排序算法在数据结构里属于最为重要的一部分,例如我们熟悉的冒泡、选择、插入、归并等,这些当初在第一次学习的时候,并没有很好的掌握,现在因为在备战考研,刚刚进行完数据结构的一轮简单复习在开始整理一轮比较重要的代码,于是从第八章开始整理7种重要的排序–冒泡、选择、希尔排序、插入、归并、堆排序。

冒泡

void BubbleSort1(int *arr,int len)
{
    int i,j;
    bool flag=false;
    //这个是从后面亡前面冒
    for(i=0;i<len;i++)//n-1
    {
        for(j=len-1;j>0;j--)
        {
            if(arr[j]<arr[j-1])//如果后面元素更小,冒上去
            {
                swap(&arr[j],&arr[j-1]);
                flag=true;
            }
        }
        if(flag==false)
        {
            return;
        }
    }
}

冒泡排序–从前面往后泡

void BubbleSort2(int *arr,int len)
{
    int i,j;
    for(i=0;i<len-1;i++)
    {
        for(j=0;j<len-1-i;j++)
        {
            if(arr[j]>arr[j+1])
            {
                swap(&arr[j],&arr[j+1]);
            }
        }
    }
}

插入排序

void InsertSort(int *arr,int len)
{
    int i,j;
    int tmp;
    for(i=1;i<len;i++)
    {
        tmp=arr[i];
        for(j=i-1;j>=0&&arr[j]>tmp;j--)
        {
            arr[j+1]=arr[j];
        }
        arr[j+1]=tmp;
    }
}

选择排序

void ChooseSort(int *arr,int len)
{
    int i,j,min;
    for(i=0;i<len-1;i++)
    {
        min=i;
        for(j=i+1;j<len;j++)
        {
            if(arr[j]<arr[min])
            {
                min=j;
            }
        }
        if(min!=i)
        {
            swap(&arr[i],&arr[min]);
        }
    }
}

希尔排序

void ShellSort(int *arr,int len)
{
    int i,j,dk;
    int tmp;
    for(dk=len/2;dk>=1;dk=dk/2)
    {
        for(i=dk+1;i<len;i+=1)
        {
            tmp=arr[i];
            for(j=i-dk;j>=0&&arr[j]>tmp;j-=dk)
            {
                arr[j+dk]=arr[j];
            }
            arr[j+dk]=tmp;
        }
    }
}

快速排序

int GetPortion(int *arr,int low,int high)
{
    int Portion=arr[low];
    while (low<high)
    {
        while (low<high&&arr[high]>=Portion)high--;//往前搜索
            arr[low]=arr[high];
        while (low<high&&arr[low]<=Portion)low++;//向后搜索
            arr[high]=arr[low];//比标记大的放后面
    }
    arr[low]=Portion;
    return low;
}
void QuickSort(int *arr,int low,int len)
{
    int Position= GetPortion(arr,low,len);
    if(low<len)
    {
        QuickSort(arr,low,Position-1);
        QuickSort(arr,Position+1,len);
    }
}

堆排序

void BuildMax(int *arr,int start,int end)
{
    int dad=start;
    int son=2*dad+1;
    while (son<=end)
    {
        if(son+1<=end&&arr[son]<arr[son+1])
        {
            son++;
        }
        else if(arr[dad]>arr[son])
        {
            return;
        } else{
            swap(&arr[dad],&arr[son]);
            dad=son;
            son=2*dad+1;
        }
    }
}
void HeapSort(int *arr,int len)
{
    int i;
    for(i=len/2-1;i>=0;i--)//从len/2-10
    {
        BuildMax(arr,i,len-1);//调用构建大根堆的函数
    }
}

归并排序

void Merge(int *arr,int low,int mid,int len)
{
    int *A=(int *) malloc(sizeof(int )*(len+1));
    int i,j,k;
    for(i=low;i<=len;i++)
    {
        A[i]=arr[i];//将arr的元素复制到A中
    }
    for(i=low,j=mid+1,k=i;i<=mid&&j<=len;k+=1)
    {
        if(A[i]<=A[j])
        {
            arr[k]=A[i++];
        } else
            arr[k]=A[j++];
    }
    while (i<=mid)arr[k++]=A[i++];
    while (j<=len)arr[k++]=A[j++];//后面还没处理好的元素
}
void MergeSort(int *arr,int low,int len)
{
    if(low<len)
    {
        int mid=(low+len)/2;
        MergeSort(arr,low,mid);
        MergeSort(arr,mid+1,len);
        Merge(arr,low,mid,len);//合并在一起

    }
}

将所有代码合并在一起(C语言完成)

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
//本项目将总结所有考研重要的排序算法
void Menu_Show()
{
    printf("********Choose The way about Sorting*********\n");
    printf("************************\n");
    printf("1、BubbleSort1\n");
    printf("2、BubbleSort2\n");
    printf("3、InsertSort\n");
    printf("4、ChooseSort\n");
    printf("5、ShellSort\n");
    printf("6、QuickSort\n");
    printf("7、HeapSort\n");
    printf("8、MergeSort\n");
    printf("************************\n");
}
void swap(int *a,int *b)
{
    int tmp=*a;
    *a=*b;
    *b=tmp;
}
int Str_Change_To_Number(char *str)
{
    if(strcmp(str,"BubbleSort1")==0)
    {
        return 1;
    }
    else if(strcmp(str,"BubbleSort2")==0)
    {
        return 2;
    }
    else if(strcmp(str,"InsertSort")==0)
    {
        return 3;
    }
    else if(strcmp(str,"ChooseSort")==0)
    {
        return 4;
    }
    else if(strcmp(str,"ShellSort")==0)
    {
        return 5;
    }
    else if(strcmp(str,"QuickSort")==0)
    {
        return 6;
    }
    else if(strcmp(str,"HeapSort")==0)
    {
        return 7;
    }
    else if(strcmp(str,"MergeSort")==0)
    {
        return 8;
    }
    else{
        return -1;
    }
}
void BubbleSort1(int *arr,int len)
{
    int i,j;
    bool flag=false;
    for(i=0;i<len;i++)//n-1
    {
        for(j=len-1;j>0;j--)
        {
            if(arr[j]<arr[j-1])//如果后面元素更小,冒上去
            {
                swap(&arr[j],&arr[j-1]);
                flag=true;
            }
        }
        if(flag==false)
        {
            return;
        }
    }
}
void BubbleSort2(int *arr,int len)
{
    int i,j;
    for(i=0;i<len-1;i++)
    {
        for(j=0;j<len-1-i;j++)
        {
            if(arr[j]>arr[j+1])
            {
                swap(&arr[j],&arr[j+1]);
            }
        }
    }
}
void InsertSort(int *arr,int len)
{
    int i,j;
    int tmp;
    for(i=1;i<len;i++)
    {
        tmp=arr[i];
        for(j=i-1;j>=0&&arr[j]>tmp;j--)
        {
            arr[j+1]=arr[j];
        }
        arr[j+1]=tmp;
    }
}
void ChooseSort(int *arr,int len)
{
    int i,j,min;
    for(i=0;i<len-1;i++)
    {
        min=i;
        for(j=i+1;j<len;j++)
        {
            if(arr[j]<arr[min])
            {
                min=j;
            }
        }
        if(min!=i)
        {
            swap(&arr[i],&arr[min]);
        }
    }
}
void ShellSort(int *arr,int len)
{
    int i,j,dk;
    int tmp;
    for(dk=len/2;dk>=1;dk=dk/2)
    {
        for(i=dk+1;i<len;i+=1)
        {
            tmp=arr[i];
            for(j=i-dk;j>=0&&arr[j]>tmp;j-=dk)
            {
                arr[j+dk]=arr[j];
            }
            arr[j+dk]=tmp;
        }
    }
}
int GetPortion(int *arr,int low,int high)
{
    int Portion=arr[low];
    while (low<high)
    {
        while (low<high&&arr[high]>=Portion)high--;//往前搜索
            arr[low]=arr[high];
        while (low<high&&arr[low]<=Portion)low++;//向后搜索
            arr[high]=arr[low];//比标记大的放后面
    }
    arr[low]=Portion;
    return low;
}
void QuickSort(int *arr,int low,int len)
{
    int Position= GetPortion(arr,low,len);
    if(low<len)
    {
        QuickSort(arr,low,Position-1);
        QuickSort(arr,Position+1,len);
    }
}
void BuildMax(int *arr,int start,int end)
{
    int dad=start;
    int son=2*dad+1;
    while (son<=end)
    {
        if(son+1<=end&&arr[son]<arr[son+1])
        {
            son++;
        }
        else if(arr[dad]>arr[son])
        {
            return;
        } else{
            swap(&arr[dad],&arr[son]);
            dad=son;
            son=2*dad+1;
        }
    }
}
void HeapSort(int *arr,int len)
{
    int i;
    for(i=len/2-1;i>=0;i--)//从len/2-11
    {
        BuildMax(arr,i,len-1);
    }
}
void Merge(int *arr,int low,int mid,int len)
{
    int *A=(int *) malloc(sizeof(int )*(len+1));
    int i,j,k;
    for(i=low;i<=len;i++)
    {
        A[i]=arr[i];//将arr的元素复制到A中
    }
    for(i=low,j=mid+1,k=i;i<=mid&&j<=len;k+=1)
    {
        if(A[i]<=A[j])
        {
            arr[k]=A[i++];
        } else
            arr[k]=A[j++];
    }
    while (i<=mid)arr[k++]=A[i++];
    while (j<=len)arr[k++]=A[j++];//后面还没处理好的元素


}
void MergeSort(int *arr,int low,int len)
{
    if(low<len)
    {
        int mid=(low+len)/2;
        MergeSort(arr,low,mid);
        MergeSort(arr,mid+1,len);
        Merge(arr,low,mid,len);//合并在一起

    }
}
void Show(int *arr,int len)
{
    for (int i = 0; i <len; ++i) {
        printf("%d ",arr[i]);
    }
}
int main()
{
    int arr[]={1,51,67,99,134,78,990,69,56,123};//1 51 56 67 69 78 99 123 134 990
    int len= sizeof(arr)/ sizeof(int );
    Menu_Show();
    char str[100];
    gets(str);
    int Index= Str_Change_To_Number(str);
    switch (Index) {
        case 1:
            BubbleSort1(arr,len);
            break;
        case 2:
            BubbleSort2(arr,len);
            break;
        case 3:
            InsertSort(arr,len);
            break;
        case 4:
            ChooseSort(arr,len);
            break;
        case 5:
            ShellSort(arr,len);
            break;
        case 6:
            QuickSort(arr,0,len-1);
            break;
        case 7:
            HeapSort(arr,len);//每个case后都要要break,否则原来的堆排序会被归并排序的结果覆盖
            break;
        case 8:
            MergeSort(arr,0,len-1);
            break;
        default:
            printf("Not exist the way of sorting--立即推--放弃考研");
            exit(0);
    }
    Show(arr,len);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值