排序算法

一、二叉树的叶子节点、度
叶子节点表示而二叉树最末端的节点,不再有新的子节点延伸,度为1。
度为2的节点表示可延伸两个子节点,度为1就是一个,0就是叶子节点。
度为2的节点数a与度为0的节点数b存在关系式 a=b-1

二、关于各种排序的详解
1.插入排序
插入排序基本原理:第一轮将数组第一个数与数组其他数进行比较,找出最小的数并与第一个数交换位置;第二轮开始从第二个数开始,并与其后面的数进行比较,找出最小并交换,以此类推

int a[]={38,65,97,76,13,27,49};//以此数组为例
void function(int* a,int length)
{
  int flag,min,temp;
  for(int i=0;i<length;++i)
  {
     temp=a[i];
     flag=i;
     for(int j=i+1;j<length;++j)
     {
        if(temp>a[j])
        {
           temp=a[j];
           flag=j;
        }
     }
     if(flag>i)
     {
       a[flag]=a[i];
       a[i]=temp;
     }
  }
}

2.插入排序
插入排序原理:以数组[38,65,97,76,13,27,49]为例
第一次插入38后:[38]65,97,76,13,27,49
第二次插入65后:[38 65]97,76,13,27,49
第三次插入97后 : [38 65 97]76,13,27,49
第四次插入76后:[38 65 76 97] 13,27,49
第五次插入13后:[13 38 65 76 97] 27 49
第六次插入27后:[13 27 38 65 76 97] 49
第七次插入49后:[13 27 38 49 65 76 97]

func(int*a,int length)
{
   for(int i=1;i<length;++i)
     {    j=i;
        while(j>=1&&a[j]<a[j-1])
        {
          int temp=a[j];
          a[j]=a[j-1];
          a[j-1]=temp;
          --j;
        }
     }
}

3.冒泡排序
原理:每轮从第一个数开始,相邻两个数以此比较,如果前面比后面小,则继续比较;若后面比前面大,则交换位置。直至比较n-1轮。

void func(int* a,int length)
{
  int temp;
  for(int i=1;i<length;++i)
    for(int j=0;j<length-i;++j)
    {
       if(a[j]>a[j+1])
       {
         temp=a[j];
         a[j]=a[j+1];
         a[j+1]=temp;
       }
    }
}

4.归并排序
原理:“归”代表递归的意思,“并”代表合并。对于给定一组数组,先将每两个相邻长度为1的子序列进行归并,得到n/2个长度为2或1的有序子序列,再将其两两归并,反复执行此过程,直到得到有序序列

5.快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。

void sort(int* a, int low, int high)
{   
    if (low >= high)
        return;
    int key = a[low];
    int i = low;
    int j = high;
    while (i < j)
    {
        while (j)
        {
            if (key > a[j])
            {
                a[i] = a[j];
                a[j] = key;
                break;
            }
            --j;
        }
        ++i;
        while (i)
        {
            if (key <= a[i])
            {
                a[j] = a[i];
                a[i] = key;
                break;
            }
            ++i;
        }
        --j;
    }
    sort(a, low, i - 1);
    sort(a, i + 1, high);
}
   sort(a,low,i-1);  //左边部分比右边小,所以再对左边部分做递归快速排序
   sort(a,i+1,high); //右边部分普遍比左边大,所以再对右边部分做快速递归排序
}

快排的递归截止条件就是已按顺序排列则程序不再执行

6.希尔排序
原理:将待排序数组分成多个子序列,每个子序列的元素个数相对较少,对各个子序列分别进行直接插入排序,待整个排序序列“基本有序后”,对所有元素再进行一次直接插入排序

7.堆排序
原理:堆排序主要分为两个过程->1.构建堆 2.交换堆顶元素与最后一个元素的位置
http://jingyan.baidu.com/article/5225f26b057d5de6fa0908f3.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值