zoukankan      html  css  js  c++  java
  • 排序算法

    最近忙着复习找工作,熟悉了下排序算法,动手写了一下,发现有些问题的边界条件还是没有考虑清楚,不过好在调试成功。

    不稳定排序:堆排序,快速排序,希尔排序;稳定排序:插入排序,冒泡排序,选择排序,归并排序,基数排序等。

    插入排序算法代码:

    void InsertSort(int A[],int n)
    {
        for(int i=1;i<n;i++)
        {
            int key=A[i];
            int j=i-1;
            while(j>=0 && A[j]>key)
            {
                A[j+1]=A[j];
                j--;
            }
            A[j+1]=key;
        }
    }

    冒泡排序代码:

    void BubbleSort(int data[],int n)
    {
        int flag=0;
        for(int i=0;i<n;i++)
        {
            flag=0;
            for(int j=n-1;j>i;j--)
            {
                if(data[j]<data[j-1])
                {
                    swap(data[j],data[j-1]);
                    flag=1;
                }
            }
            if(flag==0)
                break;
        }

    下面是堆排序代码:

    #include <iostream>
    
    using namespace std;
    //堆筛选函数
    //已知H[start~end]中除了start之外均满足堆的定义
    //本函数进行调整,使H[start~end]成为一个大顶堆
    void HeapAdjust(int H[], int start, int end)
    {
        int temp = H[start];
        for(int i = 2*start + 1; i<=end; i*=2)
        {
            //因为假设根结点的序号为0而不是1,所以i结点左孩子和右孩子分别为2i+1和2i+2
            if(i<end && H[i]<H[i+1])//左右孩子的比较
            {
                ++i;//i为较大的记录的下标
            }
    
            if(temp > H[i])//左右孩子中获胜者与父亲的比较
            {
                break;
            }
            //将孩子结点上位,则以孩子结点的位置进行下一轮的筛选
            H[start]= H[i];
            start = i;
        }
        H[start]= temp; //插入最开始不和谐的元素
    }
    void HeapSort(int A[], int n)
    {
        //先建立大顶堆
        for(int i=n/2; i>=0; --i)
        {
            HeapAdjust(A,i,n-1);
        }
        //进行排序
        for(int i=n-1; i>0; --i)
        {
            //最后一个元素和第一元素进行交换
            swap(A[0],A[i]);
            //然后将剩下的无序元素继续调整为大顶堆
            HeapAdjust(A,0,i-1);
        }
    }
    int main()
    {
        int A[]={4,1,3,2,16,9,10,14,8,7};
        HeapSort(A,10);
        for(int i=0;i<10;i++)
            cout << A[i] << " ";
        return 0;
    }

    快速排序:

    int RandomInRange(int start,int end)
    {
        int random=rand()%(end-start+1)+start;
        return random;
    }
    int Partition(int data[],int length,int start,int end)
    {
        if(data==NULL||length<=0||start<0||end>=length)
        {
            cout << "Invaild Parameters" << endl;
            return -1;
        }
        int index=RandomInRange(start,end);
        swap(data[index],data[end]);
        int small=start-1;
        for(index=start;index<=end;index++)
        {
            if(data[index]<data[end])
            {
                ++small;
                if(small!=index)
                    swap(data[index],data[small]);
            }
        }
        ++small;
        swap(data[small],data[end]);
        return small;
    }
    void QuickSort(int data[],int length,int start,int end)
    {
        if(start==end)
            return;
        int index=Partition(data,length,start,end);
        if(index>start)
            QuickSort(data,length,start,index-1);
        if(index<end)
            QuickSort(data,length,index+1,end);
    }

    归并排序代码:

    void mergeArray(int a[],int first,int mid,int last,int temp[])
    {
        int i=first,j=mid+1;
        int m=mid,n=last;
        int k=0;
        while(i<=m&&j<=n)
        {
            if(a[i]<a[j])
            {
                temp[k++]=a[i++];
            }
            else
                temp[k++]=a[j++];
        }
        while(i<=m)
            temp[k++]=a[i++];
        while(j<=n)
            temp[k++]=a[j++];
        for(int i=0;i<k;i++)
            a[first+i]=temp[i];
    }
    void mergesort(int a[],int first,int last,int temp[])
    {
        if(first<last)
        {
            int mid=(last+first)/2;
            mergesort(a,first,mid,temp);
            mergesort(a,mid+1,last,temp);
            mergeArray(a,first,mid,last,temp);
        }
    }

    选择排序:

    void SelectSort(int data[],int n)
    {
        for(int i=0;i<n-1;i++)
        {
            int index=i;
            for(int j=i+1;j<n;j++)
            {
                if(data[j]<data[index])
                    index=j;
            }
            if(index!=i)
                swap(data[index],data[i]);
        }
    }

    希尔排序:

    void ShellInsert(int data[],int d,int n)
    {
        for(int i=d;i<n;i++)
        {
            int j=i-d;
            int temp=data[i];
            while(j>=0 && data[j]>temp)
            {
                data[j+d]=data[j];
                j-=d;
            }
            if(j!=i-d)
                data[j+d]=temp;
        }
    }
    void ShellSort(int data[],int n)
    {
        int d=n/2;
        while(d>=1)
        {
            ShellInsert(data,d,n);
            d/=2;
        }
    }

    基数排序:

    #define RADIX 10
    #define KEYNUM 10   //关键字位数
    int GetDigit(int num,int pos)
    {
        int temp=1;
        for(int i=0;i<pos-1;i++)
            temp *= 10;
        return (num/temp)%10;
    }
    void RadixSort(int data[],int n)
    {
        int *Radix[10];
        for(int i=0;i<10;i++)
        {
            Radix[i]=(int *)malloc(sizeof(int) * (n + 1));
            Radix[i][0]=0;
        }
        for(int pos=1;pos<=KEYNUM;pos++)
        {
            for(int i=0;i<n;i++)
            {
                int digit=GetDigit(data[i],pos);
                int index=++Radix[digit][0];
                Radix[digit][index]=data[i];
            }
            for(int i=0,j=0;i<10;i++)
            {
                for(int k=1;k<=Radix[i][0];k++)
                {
                    data[j++]=Radix[i][k];
                }
                Radix[i][0]=0;
            }
        }
    }
  • 相关阅读:
    windwos8.1英文版安装SQL2008 R2中断停止的解决方案
    indwows8.1 英文版64位安装数据库时出现The ENU localization is not supported by this SQL Server media
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    SQL数据附加问题
    eclipse,myeclipse中集合svn的方法
    JAVA SSH 框架介绍
    SSH框架-相关知识点
    SuperMapRealSpace Heading Tilt Roll的理解
    SuperMap iserver manage不能访问本地目的(IE9)
    Myeclipse中js文件中的乱码处理
  • 原文地址:https://www.cnblogs.com/awy-blog/p/3942185.html
Copyright © 2011-2022 走看看