zoukankan      html  css  js  c++  java
  • 排序总结

    1、冒泡排序:每次将最大或最小值通过交换放到数组前面。

    void Bubble_Sort() //冒泡排序 
    {
        int i,j,tmp,pos;
        for(i=0;i<n;i++)
            for(j=0;j<n-i-1;j++)
            if(a[j]>a[j+1]){
                tmp=a[j];
                a[j]=a[j+1];
                a[j+1]=tmp;
            }
    }

    2、插入排序:

    由n-1趟排序组成,对于从P=1到P=n-1趟排序,每次排序保证从0到P之间的元素为已排序状态(即0~P-1是排好序的)。

    void Insert_Sort() //插入排序 
    {
        int i,j,tmp;
        for(i=1;i<n;i++){
            tmp=a[i];
            for(j=i;j>0&&a[j-1]>tmp;j--)
            a[j]=a[j-1];
            a[j]=tmp;
        }
    }

    3、希尔排序:

    通过比较相距一定间隔的元素来工作,这些间距序列h1,h2,……,hn又称为增量序列,相当于对这些增量序。

    相当于对独立的hi个独立的子数组进行插入排序。

    void Shell_Sort() //希尔排序 
    {
        int i,j,k,tmp;
        for(i=n/2;i>0;i/=2){
            for(j=i;j<n;j++){
                tmp=a[j];
                for(k=j;k>=i;k-=i)
                if(tmp<a[k-i]) a[k]=a[k-i];
                else break;
                a[k]=tmp;
            }
        }
    } 

     4、堆排序

    思路:

    将n个元素建一个对根节点最大的最大堆,

    然后每次DeleteMax,并将这个值放到数组末尾,最后形成一个从小到大排列的数组。

    void Swap(int &x,int &y)
    {
        int tmp=x;x=y;y=tmp;
    }
    void PercDown(int i,int len)
    {
        int tmp=a[i],child;
        for(;i*2<len;i=child){
            child=i*2;
            if(child!=len-1&&a[child+1]>a[child]) child++;
            if(tmp<a[child]) a[i]=a[child];
            else break;
        }
        a[i]=tmp;
    }
    void Heap_Sort(int len)
    {
        int i,j;
        for(i=len/2;i>=0;i--) PercDown(i,len);
        for(i=len-1;i>=0;i--){
            Swap(a[0],a[i]);
            PercDown(0,i);
        }
    }

    5、归并排序

    基本操作:合并两个有序表,先将一个数组不断划分为不同阶段的数组,然后依次合并这些数组。

    int b[1200];
    void Merge(int left,int mid,int right)
    {
        int i=left,j=mid+1,pos=left;
        while(i<=mid&&j<=right){
            if(a[i]<a[j]) b[pos++]=a[i++];
            else b[pos++]=a[j++];
        }
        while(i<=mid) b[pos++]=a[i++];
        while(j<=right) b[pos++]=a[j++];
        for(i=left;i<=right;i++) a[i]=b[i];
    }
    void Merge_Sort(int left,int right)
    {
        if(left<right){
            int mid=(left+right)/2;
            Merge_Sort(left,mid);
            Merge_Sort(mid+1,right);
            Merge(left,mid,right);
        }
    }

    6、快速排序:

    思路:先找到一个枢纽元,然后将大于枢纽元的元素放到右边,小于枢纽元的元素放到左边,

    依次递归下去,直到所有元素都有序。

    void Quick_Sort(int left,int right)
    {
        if(left>=right) return ;
        int i=left,j=right-1,tmp=a[left];
        while(i!=j){
            while(i<j&&a[j]>=tmp) j--;
            if(i<j) a[i]=a[j];
            while(i<j&&a[i]<=tmp) i++;
            if(i<j) a[j]=a[i];
        }
        a[i]=tmp;
        Quick_Sort(left,i-1);
        Quick_Sort(i+1,right);
    }
  • 相关阅读:
    POJ 2002 Squares
    POJ 1840 Eqs
    POJ 1759 Garland
    UVA 572 Oil Deposits
    POJ 3278 Catch That Cow
    POJ 2488 A Knight's Journey
    UVA 699 The Falling Leaves
    [Poi1999] 原始生物
    [bzoj3033] 太鼓达人
    [bzoj1123] BLO
  • 原文地址:https://www.cnblogs.com/2018zxy/p/10339824.html
Copyright © 2011-2022 走看看