选择排序

1.基本思想

  以升序为例,假设有n个数据,每一趟在后面n-i的待排序的数据元素集合中选出关键码最小的数据元素,作为有序序列的第i个元素,直至待排序集合中只剩下1个元素。

2.操作步骤

  举一个例子:

3.算法性能

  时间复杂度:直接选择算法需要遍历每一趟选出最小的一个数,遍历n遍,时间复杂度为O(N^2)
  稳定性:是一种不稳定的算法。

void SelectSort(int* array,int size)
{
    for (size_t i = 0; i < size-1; i++)
    {
        size_t maxPos = 0;
        for(size_t j = 1; j < size - i; j++)
        {
            if(array[j] > array[maxPos])
                maxPos = j;
        }

        if(maxPos != size - i - 1)
            swap(array[maxPos],array[size - i - 1]);
    }
}

我们可以对这种直接选择排序法进行改进,在上述的算法中,我们每一次从前向后的n-i(i从0开始)个数据中找最小的数据,并将其放到第i个位置;这里改变一下,不光从前向后找最下的数据,同时,从后向前找最大的数据,分别把他们放到对应的位置,这样,我们就可以少跑几趟了。

void SelectSortOP(int* array,int size)
{
    size_t begin = 0;
    size_t end = size-1;

    while(begin < end)
    {
        size_t maxPos = begin;
        size_t minPos = begin;
        size_t i = begin+1;
        while(i <= end)
        {
            if(array[i] > array[maxPos])
                maxPos = i;

            if(array[i] < array[minPos])
                minPos = i;
            i++;
        }

        if(maxPos != end)
            swap(array[maxPos],array[end]);

        if (minPos == end)//最小元素出现在最大元素的位置
            minPos = maxPos;

        if(minPos != begin)
            swap(array[minPos],array[begin]);

        begin++;
        end--;
    }
}

堆排序

1.基本思想

堆排序是指利用堆这种数据结构所进行的排序,利用数组的特点快速定位指定索引的元素。利用堆进行排序,比较的次数和交换的次数均比冒泡排序或选择排序少,性能较高。

2.具体步骤
  1. 创建堆:如果要排升序,需要创建大堆;降序,则需要小堆;
  2. 将堆顶的元素和当前最后一个元素交换;
  3. 最大堆元素个数减1;
  4. 向下调整,使之满足最大堆的定义
  5. 重复上述2-4步,直至数组为空。
3.算法性能
  1. 时间复杂度:堆排序的时间,主要由创建一个最大堆和每次堆顶元素交换后进行调整两部分的时间开销构成,堆排序的平均时间复杂度为O(N*logN)
  2. 空间复杂度:就地排序,辅助空间为O(1)
  3. 稳定性:是一种不稳定的排序方法。
void Adjust(int* array,int size,size_t parent)
{
    size_t child = parent*2+1;

    while(child < size)
    {
        if(child+1 < size && array[child+1] > array[child])
            child += 1;

        if(array[parent] < array[child])
        {
            swap(array[parent],array[child]);
            parent = child;
            child = parent*2+1;
        }
        else
            break;

    }
}

void HeapSort(int* array,size_t size)
{
    // 1. 创建堆
    int root = (size-2)>>1;
    for(; root >= 0; --root)
        Adjust(array,size,root);

    // 2. 堆排序
    size_t end = size-1;
    while(end)
    {
        swap(array[0],array[end]);
        Adjust(array,end,0);
        end--;
    }
}

【数据结构】排序算法——选择排序和堆排序的更多相关文章

  1. ios – 按键键入字典的Swift排序数组,其中value是可选的AnyObject

    我正在直接从Parse中提取一系列字典并将它们显示在表格中.所以我真的很想处理我所掌握的数据结构.PFObject是[String:AnyObject?解决方法Swift无法比较任何两个对象.您必须先将它们转换为特定类型:如果有多个字典没有指定键的值,它们将被放置在结果数组的末尾,但它们的相对顺序是不确定的.

  2. 用Swift实现MD5算法&amp;引入第三方类库MBProgressHUD

    之前项目里面是用objc写的MD5加密算法,最近在用swift重写以前的项目,遇到了这个问题。顺带解决掉的还有如何引入第三方的类库,例如MBProgressHUD等一些特别好的控件解决的方法其实是用objc和swift混合编程的方法,利用Bridging-header文件。你可以简单的理解为在一个用swift语言开发的工程中,引入objective-c文件是需要做的一个串联文件,好比架设了一个桥,让swift中也可以调用objective-c的类库和frame等等。

  3. swift篇第一期:简单的数据结构

    首先我们可以去使用Playground来编码,并且会实时的显示对应的编码信息,这样我们就不用每次都去运行程序来显示输出的东西了哦,也方便了我们对某些语句的验证,这个是比较赞的var与let前者为可变修饰符,后者为不可变从字面意思我们就可以很好的区分了常用的类型呢,跟其他语言基本相同啦,主要有几种:1.int类型2.Float,Double类型3.String类型4.Boolean类型当我们去声明一

  4. swift排序算法和数据结构

    vararrayNumber:[Int]=[2,4,216)">6,216)">7,216)">3,216)">8,216)">1]//冒泡排序funcmaopao->[Int]{forvari=0;i

  5. swift实现排序算法

    swift实现排序算法swift插入排序funcinsertionSort(){varx,y,key:Intfor(x=0;x-1;y--){if(key

  6. swift - 函数指针的应用 - 避免重复算法

    =nil;})}privatefuncsearch(selector:(Employee->Bool))->[Employee]{varresults=[Employee]();foreinemployees{if(selector(e)){results.append(e);}}returnresults;}}

  7. 如何用 Swift 实现 A* 寻路算法

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  8. Swift 集合数据结构性能分析

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  9. Swift中的集合类数据结构

    在那种情况下,你将会需要一种基本的集合类数据结构。继续学习,你将会比较成熟的Cocoa数据结构与对应的纯Swift结构的性能。常见iOS数据结构iOS中三种最常用的数据结构是arrays,dictionaries和sets。除了在Swift和Objective-C中旧的Foundation框架中的数据结构,现在又有了新的仅支持Swift版本的数据结构与语言紧密结合在一起。Swift数组是同质的,意味着每一个Swift数组都只包含一种类型的对象。

  10. swift算法实践1

    在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法。逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将栈顶的运算符从栈中弹出,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。

随机推荐

  1. 【数据结构】

    非线性结构:线性结构的元素之间具有线性关系,非线性结构中的元素之间不再是序列的关系,他们呈现的是更复杂的层次关系,即一个数据元素有且仅有一个直接前驱,但可有另个或者多个直接后继,显然比序列关系复杂常见非线性结构:树,图散列表PHP中的hashtable就是哈希表就是由数组和链表组成,一个长度为16的数组中,每个元素存储的是一个链表的头结点。

  2. 伸展树(SPLAY)个人总结+模板 [平衡树]【数据结构】【模板】

    前言最近3个月内,无论是现场赛还线上赛中SPLAY出现的概率大的惊人啊啊啊!!!然而不会的我就GG了,同时发现大家都会SPLAY,,,,然后就学习了一波。——————————————————————————-附上整体代码-md贴上来太卡了,去题解里看吧维护序列的维护一堆数的

  3. BZOJ 1895 &amp; POJ 3580 supermemo [SPLAY]【数据结构】

    Ay}Ttimes.Forexample,performing“REVOLVE242”on{1,5}INSERTxP:insertPafterAx.Forexample,performing“INSERT24”on{1,5}DELETEx:deleteAx.Forexample,performing“DELETE2”on{1,5}MINxy:querytheparticipantwhatistheminimumnumberinsub-sequence{Ax…Ay}.Forexample,thecorrec

  4. 【数据结构】单调栈

    显然,每个发射站发来的能量有可能被0或1或2个其他发射站所接受,特别是为了安全,每个发射站接收到的能量总和是我们很关心的问题。由于数据很多,现只需要你帮忙计算出接收最多能量的发射站接收的能量是多少。输入输出格式输入格式:第1行:一个整数N;第2到N+1行:第i+1行有两个整数Hi和Vi,表示第i个人发射站的高度和发射的能量值。输入输出样例输入样例:34235610输出样例:7题解中有讲解代码实现

  5. 陈越《数据结构》第三讲 树上

    -这个集合可以为空;-若不为空,则它是由根结点和称为其左子树TL和右子树TR的两个不相交的二叉树组成。特殊二叉树二叉树的性质二叉树的存储结构顺序存储;链式存储在此处再次说一说:typedefstructPloyNode*polynomial;//这句有什么用呢?你可以用polyNode来代表整个结构体变量。

  6. 陈越《数据结构》第二章 线性结构

    表中元素个数称为线性表的长度;线性表没有元素时,称为空表;表起始位置称表头,表结束位置称表尾。插入和删除操作只能在链栈的栈顶进行。

  7. 陈越《数据结构》第一讲 基本概念

    陈越《数据结构》第一讲基本概念1什么是数据结构1.1引子例子:如何在书架上摆放图书?数据结构是:1.数据对象在计算机中的组织方式;2.数据对象必定与一系列加在其上的操作相关联;3.完成这些操作所用的方法就是算法。抽象数据类型数据类型-数据对象集;-数据集合相关联的操作集。抽象-与存放数据的机器无关;-与数据存储的物理结构无关;-与实现操作的算法和编程语言均无关。

  8. 【数据结构】 堆

    自底向上://增加/减少已有节点值Heap_Increase_Key//向堆插入新的节点HeapInsert自顶向下://替换堆顶后,维持堆函数KeepHeap//弹出堆顶函数Pop

  9. 【数据结构】【C++STL】FIFO队列&amp;优先队列

    首先都需要打头文件queueFIFO队列是先进先出的就好像排队一样STL定义FIFO队列优先队列的话是有优先级存在的STL定义优先队列定义方式都是大根堆FIFO队列和优先队列都有一些操作COYG

  10. BZOJ 1798 [Ahoi2009] Seq 维护序列seq [线段树+多重标记下传]【数据结构】

    有长为N的数列,不妨设为a1,a2,…Input第一行两个整数N和P。第二行含有N个非负整数,从左到右依次为a1,aN,。表示把所有满足t≤i≤g的ai改为ai×c。操作2:“2tgc”。同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。Output对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。SampleInput7431234567512553242379313347SampleOutput2358HINT初始时数列为。对第5次操作,和为29+34+15+16=

返回
顶部