zoukankan      html  css  js  c++  java
  • 几种重要排序总结

    一、冒泡排序

    其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n]。
    同理对a[1],a[2],...a[n-1]处理,即完成排序。

    void bubble(int a[],int n){
            int t;
            for(int i=0;i<n;i++)
                    for(int j=i+1;j<n;j++)
                            if(a[i]>a[j])
                                    t=a[i],a[i]=a[j],a[j]=t;
    }

    二、二分排序 

    原理:依次枚举每一个元素,采用二分搜索的方法在前i个数据中找到合适的位置插入(前i个数据已经排列好)。

    例:给6 1 2 7 9 3 4 5 10 8排序

    6 1 2 7 9 3 4 5 10 8

    1插到6前面
    1 6 2 7 9 3 4 5 10 8
    1 2 6 7 9 3 4 5 10 8
    1 2 6 7 9 3 4 5 10 8
    1 2 6 7 9 3 4 5 10 8

    3插到6前面
    1 2 3 6 7 9 4 5 10 8

    4插到6前面
    1 2 3 4 6 7 9 5 10 8

    5插到6前面
    1 2 3 4 5 6 7 9 10 8
    1 2 3 4 5 6 7 9 10 8

    8插到9前面
    1 2 3 4 5 6 7 8 9 10

    #include<iostream>
    using namespace std;
    void sort2(int *a,int n){
            for(int i=0;i<n;i++){//对前i个进行排序
                    int k=a[i];
                    int x=0,y=i-1;
                    while(x<=y){
                            int m=x+(y-x>>1);
                            if(a[m]>a[i])
                                    y=m-1;
                            else
                                    x=m+1;
                    }//a[x]为第一个大于a[i]的数
                    for(int j=i;j>x;j--)
                            a[j]=a[j-1];//插入点后面的数全部后移一位
                    a[x]=k;//把a[i]赋值到对应位置
            }
    }

    三、快速排序

    设置两点i,j代表向左和向右遍历到的点;

    j遇到小于6的5停止向前,i遇到大于6的7,停止;

    交换a[i]与a[j];

    i,j未再遇到符合停止条件的值,继续向前直到相遇时停止;

    将6与相遇点交换;

    此时6左边的值均小于6,右边的值均大于6,6最终的位置定下来;

    分别对6左边的片段和右边的片段重复该过程,直到片段被切成长度为1,最终所有值都找到了排序的位置。

    void quick(int a[],int x,int y){
            if(x>=y)
                    return;
            int p=a[x];
            int i=x,j=y;
            while(i<j){
            //交换右边小于p左边大于p的数字并找出p的位置
                    while(i<j&&a[j]>=p)
                            j--;
                    while(i<j&&a[i]<=p)
                            i++;
                    int t=a[i];
                    a[i]=a[j];
                    a[j]=t;
            }
            a[x]=a[i];
            a[i]=p;
            quick(a,x,i-1);//快速排序左边一段
            quick(a,i+1,y);//快速排序右边一段
    }
  • 相关阅读:
    模块化编程
    flex 弹性布局
    作用域与作用域链
    深入解读JavaScript面向对象编程实践
    javascript Null、Undefined 、NaN的联系与区别
    跨域常见解决方案
    Reverse Pairs
    315. Count of Smaller Numbers After Self
    2. Add Two Numbers
    657. Judge Route Circle
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/10704489.html
Copyright © 2011-2022 走看看