五种经典排序算法的实现(冒泡、归并、快排、堆排序、希尔)

1 篇文章 0 订阅
1 篇文章 0 订阅

转载自:http://blog.csdn.net/xamhaha/article/details/76034765

#include <iostream>
using namespace std;
void swap(int &d,int& b)
{
    int temp;
    temp=d;
    d=b;
    b=temp;
}
//冒泡排序
void Bubblesort(int arry[],int len)
{
    int i,j;
    for(i=0;i<len-1;i++)
    {
        for(j=len-1;j>i;--j)
        {
            if(arry[j]<arry[j-1])
                swap(arry[j],arry[j-1]);
        }    
    }
}
void Bubble2sort(int *arry,int len)
{
    int i,t;
    int left=1;
    int right=len-1;
    while(left<=right)
    {
        //从左到右找最大
        for(i=left;i<=right;i++)
        {
            if(arry[i]<arry[i-1])
            {
                swap(arry[i],arry[i-1]);
                t=i;
            }
        }
        right=t-1;       
        //从右到左找最小
        for(i=right;i>=left;i--)
        {
            if(arry[i]<arry[i-1])
            {
                swap(arry[i],arry[i-1]);
                t=i;
            }
        }
        left=t+1;      
    }
}
void Bubble3sort(int *arry,int len)
{
    int i;
    bool flag;
    flag=true;
    while(flag)
    {
        flag=false;
        for(i=1;i<len;i++)
        {
            if(arry[i-1]>arry[i])
            {
                swap(arry[i-1],arry[i]);
                flag=true;
            }
        }
    }
}
void Bubble4sort(int *arry,int len)
{
    int i,k,flag;
    flag=len;
    while(flag>0)
    {
        k=flag;
        flag=0;
        for(i=1;i<k;i++)
        {
            if(arry[i-1]>arry[i])
            {
                swap(arry[i-1],arry[i]);
                flag=i;
            }
        }
    }
}
//归并排序
void mergesort(int*,int,int,int*);
void mergearry(int*,int,int,int,int*);
bool Mergesort(int arry[],int len)
{
    int *pTemp=new int[len];
    if(pTemp==NULL)
        return false;
    mergesort(arry,0,len-1,pTemp);
    return true;
}
void mergesort(int arry[],int first,int last,int temp[])
{
    if(first<last)
    {
        int mid=(first+last)/2;
        mergesort(arry,first,mid,temp);
        mergesort(arry,mid+1,last,temp);
        mergearry(arry,first,mid,last,temp);
    }
}
void mergearry(int arry[],int first,int mid,int last,int temp[])
{
    int i=first,j=mid+1;
    int n=mid,m=last;
    int k=0;
    while(i<=n&&j<=m)
    {
        if(arry[i]<arry[j])
            temp[k++]=arry[i++];
        else
            temp[k++]=arry[j++];
    }
    while(i<=n)
        temp[k++]=arry[i++];
    while(j<=m)
        temp[k++]=arry[j++];
    for(i=0;i<k;i++)
    {
        arry[first+i]=temp[i];
    }
}
//快速排序
void Quicksort(int arry[],int left,int right)
{
    if(left<right)
    {
        int i=left,j=right,x=arry[i];
        while(i<j)
        {
            while(i<j && arry[j]>=x)
                j--;
            if(i<j)
                arry[i++]=arry[j];
            while(i<j && arry[i]<x)
                i++;
            if(i<j)
                arry[j--]=arry[i];
        }
        arry[i]=x;
        Quicksort(arry,left,i-1);
        Quicksort(arry,i+1,right);
    }
}
//堆排序(大顶堆、小顶堆)
//从i节点开始调整,len为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2
//调整为大顶堆
void AdjustMaxHeap(int *arry,int i,int len)
{
    int j,temp;
    temp=arry[i];
    j=2*i+1;
    while(j<len)
    {
        if(j+1<len && arry[j+1]>arry[j])
            j++;
        if(arry[j]<=temp)
            break;
        arry[i]=arry[j];
        i=j;
        j=2*i+1;
    }
    arry[i]=temp;
}
//调整为小顶堆
void AdjustMinHeap(int *arry,int i,int len)
{
    int temp,child;
    for(temp=arry[i];2*i+1<=len;i=child)
    {
        child=2*i+1;
        if(child<len && arry[child]>arry[child+1])
            child++;
        if(arry[child]<temp)
            arry[i]=arry[child];
        else
            break;
    }
    arry[i]=temp;
}

void HeapSort(int *arry,int len)
{
    int i;
    for(i=len/2-1;i>=0;i--)
    {
        AdjustMaxHeap(arry,i,len);//arry[]={9 7 8 5 6 0 1 4 2 3}
//        AdjustMinHeap(arry,i,len-1);//arry[]={0 2 1 4 3 8 5 7 9 6}
    }
    for(i=len-1;i>=1;i--)
    {
        swap(arry[i],arry[0]);
        AdjustMaxHeap(arry,0,i);//arry[]={0 1 2 3 4 5 6 7 8 9}
//        AdjustMinHeap(arry,0,i-1);//arry[]={9 8 7 6 5 4 3 2 1 0}
    }
}
//希尔排序
void Shellsort(int *arry,int len)
{
    int i,j,h,temp;
    for(h=len/2;h>0;h=h/2)
    {
        for(i=h;i<len;i++)
        {
            temp=arry[i];
            for(j=i-h;j>=0;j=j-h)
            {
                if(temp<arry[j])
                {
                    arry[j+h]=arry[j];
                }
                else
                    break;
            }
            arry[j+h]=temp;
        }
    }
}

int main()
{
    int k;
    int c[]={5,4,8,2,6,0,1,7,9,3};
    int len=sizeof(c)/sizeof(c[0]);
//    Bubble4sort(c,len);
//    Mergesort(c,len);
//    Quicksort(c,0,len-1);
//    HeapSort(c,len);
    Shellsort(c,len);
    for(k=0;k<len;k++)
        cout<<c[k]<<' ';
    cout<<endl;
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内部排序合集(插入、希尔、起泡、快速、选择、堆、归并和基数排序) 这是我在我们期末的时候写的一些内部排序的例子。因为我们的数据结构考试的范围就限定在内部排序上,所以我没有什么办法,只好对自己埋头苦干就行内部排序的编程了。有些内部排序的例子很是好理解,我们可以通过一些图示来很好地了解到这些排序的过程,但是这些程序的代码可能不是那么好写。而另外一些程序的思想既难以理解,也难于编码。着实地伤透了我的脑筋。下面就将我的程序的主框架代码展示给大家看看。注意,在这里我怎样也不好实现2-路插入排序,因为它这样的排序方法运用在顺序存储结构下不好,在判断数组越界的时候这样的复杂性使我最终放弃了这种方法。要不还不如使用其余的排序呢。 毕竟了解内部排序是一件好事,以后在看一些内部排序的时候也不至于摸不着头脑。最近我看到了一本有关介绍用C++来编辑游戏的书,它就以STL为例,讲解了STL内部实现的机理。 // 头文件 #include using namespace std; #include "InsertionSort.h" #include "Shell'sSort.h" #include "QuickSort.h" #include "SelectionSort.h" #include "MergingSort.h" #include "RadixSort.h" // 定义的宏 #define LENGTH 10 // 主函数 int main( int argc, char** argv ) { // 定义一个顺序表 SqList a; int objArray[LENGTH] = { 278, 109, 63, 930, 589, 184, 505, 269, 8, 83 }; a.length = LENGTH; int i; for ( i = 1; i < a.length + 1; i++ )// 需要将0号位设为监视哨 { a.r[i].key = objArray[i-1]; a.r[i].otherinfo = '\0'; } // 直接插入排序 //InsertSort( a ); // 折半插入排序 //BInsertSort( a ); // 2-路插入排序 //BinRouteInsertSort( a, 2 );// 这个算法有问题 // 希尔排序 /* { int dlta2[3] = { 3, 2, 1 }; ShellSort( a, dlta2, 3 ); } */ // 起泡排序 //BubbleSort( a ); // 快速排序 //QuickSort( a, 1, LENGTH ); // 选择排序 //SelectSort( a ); // 堆排序 //HeapSort( a ); // 归并排序 //MergeSort( a ); // 基数排序 { SLList b; int i; b.keynum = 3, b.recnum = LENGTH;// 对3位整数进行基数排序 for ( i = 1; i <= b.recnum; i++ ) { b.r[i].keys[0] = objArray[i-1] % 10;// 个位 b.r[i].keys[1] = objArray[i-1] % 100 / 10;// 十位 b.r[i].keys[2] = objArray[i-1] / 100;// 百位 } RadixSort( b ); } // 显示排序后的数组 for ( i = 1; i < a.length + 1; i++ )// 需要将0号位设为监视哨 cout<<a.r[i].key<<' '; cout<<'\n'; return 0; } 要想得到这些排序的具体实现,那么就下载我的代码吧。最近我的积分由于下载一些Boost的资料而变为0了。所以需要的朋友一定要支持一下哦。(使用VS2005开发,算法都是C风格的,可以直接使用。) 我最新的动态:最近在研究DirectInput,希望能够在几天后写一篇技术文章,分享一些我的经验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值