第八章部分例题排序

归并排序

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

const int maxn=100;
int A[maxn];
int T[maxn];

void mergesort(int* A,int x,int y,int* T)
{
    if(1+x<y)              //如果写成x<y将会造成死循环
    {
        int m=x+(y-x)/2;

        mergesort(A,x,m,T);
        mergesort(A,m,y,T);

        int p=x,i=x,j=m;

        while(i<m || j<y)
        {
            if(j>=y || (i<m && A[i]<A[j])) T[p++]=A[i++];
            else T[p++]=A[j++];
        }

        for(int k=x;k<y;k++)
            A[k]=T[k];
    }
}

int main()
{
    int x=0;
    int y;
    cin>>y;

    for(int i=0;i<y;i++) cin>>A[i];

    for(int i=x;i<y;i++)
        printf("%d ",A[i]);
    printf("\n");

    mergesort(A,0,y,T);

    for(int i=x;i<y;i++)
        printf("%d ",A[i]);
    printf("\n");

    return 0;
}

注意递归基

void quicksort(int*A ,int x,int y)
{
    if(x+1>=y) return;

    int temp=A[x];

    int i=x,j=y-1;

    while(i!=j)
    {
        while(A[j]>=temp && j>i) j--;
        while(A[i]<=temp && j>i) i++;

        int t=A[i];
        A[i]=A[j];
        A[j]=t;
    }

    A[x]=A[j];
    A[j]=temp;

    quicksort(A,x,i);
    quicksort(A,i+1,y);
}
时间: 2024-10-26 06:56:07

第八章部分例题排序的相关文章

第八章 线性时间排序 8.3 基数排序

package chap08_Linear_Time_Sort; import static org.junit.Assert.*; import java.util.Arrays; import org.junit.Test; public class CopyOfSortAlgorithms { /** * 基数排序 * * @param n * @param digit */ static void radixSort(int[] n, int digit) { int[] b = new

算法导论 第八章 线性时间排序(python)

比较排序:各元素的次序依赖于它们之间的比较{插入排序O(n**2) 归并排序O(nlgn) 堆排序O(nlgn)快速排序O(n**2)平均O(nlgn)} 本章主要介绍几个线性时间排序:(运算排序非比较排序)计数排序O(k+n)基数排序O() 第一节:用决策树分析比较排序的下界 决策树:倒数第二层满,第一层可能满的二叉树,它用来表示所有元素的比较操作{于此来分析下界},忽略控制,移动操作 1:2 #A[1]和A[2]比 <= 走左边 >走右边 <3,1,2> 最后的结果 下标对应排

算法导论第八章线性时间排序

一.线性时间排序算法历史概览 计数排序首先是由 Harold H. Seward 于1954年提出,而且他还提出将计数排序和基数排序进行结合的思想:基数排序是L.J.Comrie于1929年首次在一篇描述卡片穿孔机文档中提出的一种方法,它是从最低有效位开始,对一个有多位数组成的数进行排序的方法:而桶排序的基本思想则由E.J.Isaac和R.C.Singleton于1956年提出的,之后很多研究人员在这三种算法的基础上针对不同的应用场景又进一步改进,到了今天一个很成熟.很通用的地步. 二.O(nl

算法导论--第八章、计数排序

一.计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数.利用这一信息,就可以直接把x放到它在输出数组中的位置上了.例如,如果有17个元素小于x,则将x放在第18个位置即可.但是当存在几个元素相同时,会稍许不同,否则中间会漏掉元素. 二.假设输入是一个数组A[1..n],A.length = n.另外数组B[1...n]存放排序的输出,C[0...k]提供临时的存储空间: 伪代码如下: 1 Counting-Sort(A, B, k) 2 for i <- 1 to k 3 do C[

第八章 线性时间排序

摘要: 本章先回顾了前面介绍的合并排序.堆排序和快速排序的特点及运行运行时间.合并排序和堆排序在最坏情况下达到O(nlgn),而快速排序最坏情况下达到O(n^2),平均情况下达到O(nlgn),因此合并排序和堆排序是渐进最优的.这些排序在执行过程中各元素的次序基于输入元素间的比较,称这种算法为比较排序.接下来介绍了用决策树的概念及如何用决策树确定排序算法时间的下界,最后讨论三种线性时间运行的算法:计数排序.基数排序和桶排序.这些算法在执行过程中不需要比较元素来确定排序的顺序,这些算法都是稳定的.

算法导论笔记——第八章 线性时间排序

8.1 排序算法的下界 定理8.1 在最坏情况下,任何比较排序算法都需要做Ω(nlgn)次比较. 推论8.2 堆排序和归并排序都是渐进最优的比较排序算法. 8.2 计数排序 计数排序假设n个输入元素中的每一个都是在0到k区间内的一个整数,其中k为某个整数.当k=O(n)时,排序的运行时间为θ(n). 基本思想:对每一个输入元素x,确定小于x的元素个数.C[A[j]] = C[A[j]] + 1 8.3 基数排序 Radix Sort 从LSB到MSB,一位数排序算法必须是稳定的. 若b<(lgn

第八章部分例题分治法

分解问题,递归求解,合并解 分成尽量相等的两部分 分别求出完全位于左边的序列和右边的序列 合并即在求出起点位于左边,终点位于右边的序列然后与左右的最优解比较 时间复杂度O(nlogn) #include <cstdio> #include <iostream> #include <algorithm> using namespace std; const int maxn=100; int A[maxn]; int maxsum(int* A,int x,int y)

算法导论 第8章 线性时间排序

合并排序和堆排序的时间复杂度为O(nlgn),插入排序和冒泡排序的时间复杂度为O(n^2),快速排序的时间复杂度在平均情况下是O(nlgn),这些排序算法都是通过对元素进行相互比较从而确定顺序的,因此都叫比较排序. 比较排序可以看做是决策树(一个满二叉树),因为每一次比较都是一个分支.n个元素的序列,其排序的结果有 n! 种可能(n个元素的全排),所以这个决策树有 n! 个叶子结点,假设树的高度为h,则有:n! <= 2^h,所以h >= lg(n!) = Ω(nlgn).一次比较排序就是从决

【每日算法】计数&amp;基数&amp;桶&amp;位图排序-简介

在前面的文章中,我们介绍的都是基于比较的排序. 对于比较排序,对含n个元素的序列进行排序,在最坏情况下都要用O(n logn)次比较(归并排序和堆排序是渐近最优的). 本文将继续介绍以线性时间运行的排序算法,他们使用的是非比较排序,因此下界O(n logn)对它们不适用. 计数排序 想象下面这种情况: 一个班有k个人,需要排成一条纵队,地面上已经用粉笔按从小到大的顺序标明了1到k个号码,要求按身高从低到高排列,也就是说,最高的站在标号为k的位置,最矮的站在标号为1的位置. 那么对于每个人,如何知