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;
            }
        }
    }
  • 相关阅读:
    【shell】两种字符串提取场景的实现
    【batch】批处理文件多参数处理和for循环字符串连接
    【Java】「深入理解Java虚拟机」学习笔记(4)- 类文件结构
    【Java】「深入理解Java虚拟机」学习笔记(2)- JVM内存区域
    【Java】「深入理解Java虚拟机」学习笔记(1)
    【Myeclipse】用Myeclipse10.5搭建C/C++开发环境
    【JDK】JDK模块化(1)-为什么要模块化
    【DOS】文件统计命令
    【java】转:Windows系统下面多个jdk版本切换
    【Web】servlet、filter和listener
  • 原文地址:https://www.cnblogs.com/awy-blog/p/3942185.html
Copyright © 2011-2022 走看看