zoukankan      html  css  js  c++  java
  • 快排和插入排序

    1.插入排序:资料来自:

                        MoreWindows Blog()

    直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。设数组为a[0…n-1]。

    1.      初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1

    2.      将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。

    3.      i++并重复第二步直到i==n-1。排序完成。

    1. void Insertsort1(int a[], int n)  
    2. {  
    3.     int i, j, k;  
    4.     for (i = 1; i < n; i++)  
    5.     {  
    6.         //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置  
    7.         for (j = i - 1; j >= 0; j--)  
    8.             if (a[j] < a[i])  
    9.                 break;  
    10.   
    11.         //如找到了一个合适的位置  
    12.         if (j != i - 1)  
    13.         {  
    14.             //将比a[i]大的数据向后移  
    15.             int temp = a[i];  
    16.             for (k = i - 1; k > j; k--)  
    17.                 a[k + 1] = a[k];  
    18.             //将a[i]放到正确位置上  
    19.             a[k + 1] = temp;  
    20.         }  
    21.     }  

    学了数据结构之后,我们可以用顺序表来实现,一般在实现的时候,如果0号标位不使用的话会跟好地表达:

    //顺序表结构体定义
    typedef struct {
        int * elem;//基址空间
        int length;//当前长度
        int size;//储存容量
        int increment;//扩容的增量
    }SqList;
    
    
    //直接插入算法描述:
    int InsertSort(SqList & L) {
        if (L.elem == NULL) {
            return ERROR;
        }
        int i,j;
    
        //可以这么想,就i到哪哪里之前就已经是有序项了,那i指到1,2,3,4倒数第二个3的时候,
        //1,2,3,这三个都是有序的了,而这时要处理的是4,处理完后,i就指到4,也排好了,所以是i<length
        for (i = 1; i < L.length; i++) {
            if (L.elem[i + 1] < L.elem[i]) {//说明要插到前面去,如果比他大就不用插
                L.elem[0] = L.elem[i + 1];//先放到0那存一下
                L.elem[i + 1] = L.elem[i];
                j = i ;//j初始的位置是有序列的最后一个元素
                while (j - 1 != 0 && L.elem[0] < L.elem[j - 1]) {//j所指的是确定已经比i+1大的了
                    L.elem[j] = L.elem[j - 1];
                    j--;
                }
                L.elem[j] = L.elem[0];
            }
        }
        return OK;
    }

    2.快排:

    快速排序简单的说就是选择一个基准,将比起大的数放在一边,小的数放到另一边。对这个数的两边再递归上述方法。

    66  13  51  76  81  26  57  69  23,以66为基准,升序排序的话,比66小的放左边,比66大的放右边

    从右边找到23比66小,互换(一定要右边先)

    23  13  51  76  81  26  57  69  66

    从左边找到76比66大,互换

    23  13  51  66  81  26  57  69  76

    继续从右边找到57比66小,互换

    23  13  51  57  81  26  66  69  76

    ……

    ……

    23  13  51  57  26  66  81  69  76最后所有比66小的数都在66左边,比66大的数在66右边

    接下来再分别对66左边和右边的数再次排序,即递归

    代码:

    void sort(int *a,int left,int right)//a是数组,left,right分别是左右指引

    {

      if(left>=right)return;//如果左边指引大于右边指引说明完成了

      int i=left,j=right,key=a[left];

      while(i<j)//控制第一轮,结束后所有比key小的在key左边,比key大的在key右边

      {

        while(i<j&&a[j]>=key)//从右边开始,找比key小的数

          j--;

        a[i]=a[j];//找到后赋值给左边那个数

        while(i<j&&a[i]>=key)//从右边找,找比key大的数

          i++;

        a[j]=a[i];

      }

      a[i]=key;//a[i]这个位置已经变了,所以要key回归

      sort(a,left,i-1);

      sort(a,i+1,right);//递归

    }

  • 相关阅读:
    记录C#开发遇到的问题和应用经验
    HttpApplication,HttpModule,HttpContext及Asp.Net页生命周期
    itextsharp.dll(4.0.8.0)完整示例PDF
    步步为营 .NET 设计模式学习笔记 二十三、Interpreter(解释器模式)
    .net简谈分层架构思想
    FusionCharts Free
    表解锁的方法
    步步为营 .NET 设计模式学习笔记 二十一、Visitor(访问者模式)
    步步为营 .NET 设计模式学习笔记 二十二、Memento(备望录模式)
    再论抽象
  • 原文地址:https://www.cnblogs.com/wangshen31/p/6528486.html
Copyright © 2011-2022 走看看