四种nlogn排序算法代码

1.快速排序:不稳定排序,最好情况O(nlogn),最差情况O(n^2).平均情况在所有nlogn排序中最快的排序

快速排序分两步
第一步是将l-r区间进行分块(假设将区间最后一个作为关键字)前面一块的数比小于等于关键字,后面一块大于关键字,并返回第一个大于关键字的位置,即函数partition
第二部是对l~pos-1 和pos+1~r分别进行快速排序.

递归式:
int partition(int l,int r)
{
    int k=r;
    while(l<r)
    {
        int c=0;
        if(a[l]<=a[k])
            l++;
        else
            c++;
        if(a[r]>=a[k])
            r--;
        else
            c++;
        if(c==2)
        {
            int tem=a[l];
            a[l]=a[r];
            a[r]=tem;
        }
    }
    if(l==r)
    {
        if(a[k]>=a[r])
            return r+1;
        else
            return r;
    }
    else
        return l;

}
void quicksort(int l,int r)
{
    if(l>=r)
        return;
    int pos;
    pos=partition(l,r);
    int val=a[r];
    a[r]=a[pos];
    a[pos]=val;
    quicksort(l,pos-1);
    quicksort(pos+1,r);
}

非递归式:
用栈实现,在函数各种变量和参数不是很多的情况下用递归式比较好
详细看网上

2.shell排序:不稳定排序,最好情况O(nlogn),最差情况O(n^x),1<x<2
变长度的插入排序,分别对原数组进行k次长度不同的插入排序即可,注意:最后一次必须是长度为1的插入排序
void shellsort()
{
    for(int i=0;i<=x;i++)//x代表长度的组数
    {
        for(int j=len[i];j<n;j++)//此处是j++而不是j+=len[i]注意!!,希尔排序变长度的排序思想
        {
            int k=j-len[i];
            while(k>=0)
            {
                if(a[j]<a[k])
                {
                    int tem=a[j];
                    a[j]=a[k];
                    a[k]=tem;
                    break;
                }
                else
                    k-=len[i];
            }
        }
    }
}

3.堆排序:不稳定排序,最好和最坏的时间复杂度均为O(nlogn):
主要是写向下渗透函数,然后注意:
1.当数组从0开始左儿子为2*x+1,右儿子为2*x+2
递归返回条件i》(x+1)/2-1
2.当数组从1开始左儿子为2*x,右儿子为2*x+1
递归返回条件i》(x+1)/2
class heaps
{
public:
    int heap[50]={9,8,7,6,5,4,3,2,1,34,5,6,74,24,5,1,2,3,4,55,21,13,41,3};
    int maxsize=23;
    void godown(int i,int x)
    {
        if(i>(x+1)/2-1)//返回条件,易错点
            return;
        int MAX;
        int j;
        if(i*2+2>x)//当只有左孩子的情况!!易错点
        {
            MAX=heap[i*2+1];
            j=i*2+1;
        }
        else//有两个孩子的情况
        {
            if(heap[i*2+1]>heap[i*2+2])
            {
                MAX=heap[i*2+1];
                j=i*2+1;
            }
            else
            {
                MAX=heap[i*2+2];
                j=i*2+2;
            }
        }
        if(MAX>heap[i])
        {
            heap[j]=heap[i];
            heap[i]=MAX;
            godown(j,x);
        }

}
    void buildheap()
    {
        for(int i=(maxsize+1)/2-1;i>=0;i--)
            godown(i,maxsize);
    }
    void heapsort()
    {
        int k=maxsize;
        for(int i=1;i<=maxsize;i++)
        {
            int tem=heap[k];
            heap[k]=heap[0];
            heap[0]=tem;
            k--;
            godown(0,k);//注意,堆的大小在不断变化
        }
    }
};

4.归并排序:稳定排序,最好和最坏的时间复杂度均为O(nlogn)

void merge(int* a,int l,int r)
{
    int tem[100];
    int mid=(l+r)/2;
    int i=l;
    int j=mid+1;
    int k=l;
    for(;i<=mid+1||j<=r+1;i++,j++)
    {
        if(i==mid+1&&j==r+1)
            break;
        if(i==mid+1)
        {
            tem[k++]=a[j];
            i--;
            continue;
        }
        if(j==r+1)
        {
            tem[k++]=a[i];
            j--;
            continue;
        }
        if(a[i]<a[j])
        {
            tem[k++]=a[i];
            j--;
        }
        else
        {
            tem[k++]=a[j];
            i--;
        }
    }
}
void merge_sort(int* a,int l,int r)
{
    int mid=(l+r)/2;
    if(mid+1>r)
        return;
    merge_sort(a,l,mid);
    merge_sort(a,mid+1,r);
    merge(a,l,r);
}

此外还有3种O(n^2)的排序,不详细介绍
1.选择排序:不稳定,时间复杂度 O(n^2)
2.插入排序:稳定,时间复杂度 O(n^2)
3.冒泡排序:稳定,时间复杂度 O(n^2)

时间: 2024-11-07 07:54:25

四种nlogn排序算法代码的相关文章

PHP四种基本排序算法

PHP的四种基本排序算法为:冒泡排序.插入排序.选择排序和快速排序. 下面是我整理出来的算法代码: 1. 冒泡排序: 思路:对数组进行多轮冒泡,每一轮对数组中的元素两两比较,调整位置,冒出一个最大的数来. //简单版: function bubbleSort($arr) { $n = count($arr); for($i=1;$i<$n;$i++) {   //冒泡的轮数(最多$n-1轮) for($j=0;$j<$n-1;$j++) {   //每一轮冒泡(两两比较,大者后移) if($a

php四种基础排序算法的运行时间比较!

/** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 function bubbleSort($array){ $temp = 0; for($i = 0;$i < count($array) -1;$i++){ for($j = 0;$j < count($array) - 1 -$i;$j++){ if($array[$j] > $arra

php四种基础排序算法的运行时间比较

/** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 function bubbleSort($array){ $temp = 0; for($i = 0;$i < count($array) -1;$i++){ for($j = 0;$j < count($array) - 1 -$i;$j++){ if($array[$j] > $arra

PHP 四种基本排序算法的代码实现

许多人都说算法是程序的核心,算法的好坏决定了程序的质量.作为一个初级phper,虽然很少接触到算法方面的东西.但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具.这里介绍冒泡排序,插入排序,选择排序,快速排序四种基本算法,分析一下算法的思路. 前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序.$arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序 思路分析:在要排序的一组数中,对当前还未排好的序列

PHP 四种基本排序算法的代码实现(2)

许多人都说算法是程序的核心,算法的好坏决定了程序的质量.作为一个初级phper,虽然很少接触到算法方面的东西.但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具.这里介绍冒泡排序,插入排序,选择排序,快速排序四种基本算法,分析一下算法的思路. 前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序. $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序 思路分析:在要排序的一组数中,对当前还未排好的序

PHP实现四种基本排序算法

前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序. $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序 思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 代码实现:$arr=array(1,43,54,62,21,66,32,78,36,76,39);  f

php 四种基本排序算法

冒泡排序 思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来. 第一轮:从第一个到最后一个冒泡比较,运行结果:最后一个最大 第二轮:从第一个到倒数第二个冒泡比较, 运行结果:最后一个最大(当前轮的最后一个) 以此类推... $arr=array(1,43,54,62,21,66,32,78,36,76,39); function getpao($arr) { $len=count($arr); //设置一个空数组 用来接收冒出来的泡 //该层循环控制 需要冒泡的轮数 for(

js四种常用排序算法

1.冒泡排序解析:1.相邻的两个元素进行比较,如果前一个比后一个大,则交换位置2.第一轮的时候最后一个元素是最大的3.因为经过一轮操作之后,最后一个元素是最大的了.所以第二次再一一比较会比上一轮少一次 2.快速排序解析:1.取中间索引对应的数据 然后将剩余数据分别与中间数进行比较,小的放一边,大的放另一边.2.再分别对左右两边的数据重复上述操作.采用递归调用,两边都能实现快速排序3.插入排序解析1.第一个元素为默认2.去下一个元素,让该元素与其前面的元素进行比较3.如果该元素比前面的大,将该元素

笔试算法题(53):四种基本排序方法的性能特征(Selection,Insertion,Bubble,Shell)

四种基本算法概述: 基本排序:选择,插入,冒泡,希尔.上述算法适用于小规模文件和特殊文件的排序,并不适合大规模随机排序的文件.前三种算法的执行时间与N2成正比,希尔算法的执行时间与N3/2(或更快)成正比: 前三种算法在平均,最坏情况下都是N2,而且都不需要额外的内存:所以尽管他们的运行时间只相差常数倍,但运行方式不同: 对于已经就序的序列而言,插入排序和冒泡排序的运行时间都是O(N),但是选择排序的时间仍旧是O(N^2): 因为Insertion和Bubble都是相邻项间的比较交换,所以不会出