排序【2】选择排序

10人阅读 评论(0) 收藏 举报
分类:

选择排序

算法思想:以升序为例,在整个区间中找出排序码最小的元素,如果这个元素不是这组序列中的第一个元素,那么将它和第一个元素进行交换,使得最小的元素就在第一个位置,然后缩小区间,循环执行上述操作,只到区间中只剩下一个元素。
具体步骤(升序)

  1. 在区间中找到关键码最小的元素。
  2. 如果不是待排序区间的第一个元素,则和带排序区间第一个元素交换。
  3. 缩小待排序区间。这里写图片描述
    代码实现:
void ChangeSort(int *array, int size)
{
    assert(array);
    for (int i = 1; i < size; ++i)
    {
        int minindex = i;//未排序的最小元素下标
        int start = i - 1;//未排序区间第一个元素下标
        while (minindex<size)
        {
            if (array[minindex] < array[start])
                swap(array[minindex], array[start]);
            ++minindex;
        }

    }
}

算法性能
时间复杂度:最好的情况是已经有序,交换次数为0,最坏的情况是逆序,交换次数是n-1,比较次数与关键字的初始状态无关。总的比较次数为N=n*(n-1)/2,所以时间复杂度为O(N^2)
空间复杂度:O(1)
稳定性:不稳定


堆排序

基本思想:堆排序就是利用堆这种数据结构实现的一种排序算法,堆是完全二叉树的一种。堆的特点是:

  1. 最大堆:每一个父节点的值都大于两个子节点
  2. 最小堆:每一个父节点的值都小于两个子节点
    堆排序的基本思想就是利用了这种结构,如果我们需要升序:
    1.把所有[a1,a2,a3…an]建成大堆。
    2.把堆顶的元素(即数组中最大的元素和堆中最后一个元素交换),此时分为两个区域,一个[a1,a2,an–1]无序区和[an]有序区。
    3.因为交换了元素,有可能会违反了堆的性质,因此无序区的元素进行调整,满足堆的性质。
    4.重复步骤2,直到有序区的元素有n-1个。
    这里写图片描述
    代码实现:
void AdJustDown(int *array, int size, int n)
{
    int parent = n;
    int child = parent*+1;
    while (child<n)
    {
        if ((child + 1 < size) && array[child] < array[child + 1])
        {
            ++child;
        }
        if (array[child] > array[parent])
        {
            swap(array[child], array[parent]);
            parent = child;
            child = parent * 2 + 1;
        }
        else
        {

            break;
        }
    }
}
void HeapSort(int *array, int size)
{
    assert(array);
    for (int i=(size-2)>>1;i>=0;++i)
    {
        AdJustDown(array,size,i);//创建大堆,将所有数据都重新排序
    }
    for (int i = size - 1; i >= 0; ++i)
    {
        swap(array[0], array[size]);//交换堆顶元素和已序序列第一个元素
        AdJustDown(array, i, 0);//缩小区间,调整堆结构
    }

}

算法性能

  1. 时间复杂度:因为堆中元素的个数是N,所以堆的高度是logN,那么比较次数就是2logN,交换的次数是N次,所以平均时间复杂度是O(NlogN)
  2. 空间复杂度:O(1)
  3. 稳定性:不稳定

验证结果:
这里写图片描述

查看评论

常见排序算法(二)(选择排序)

本文介绍排序算法中的选择排序,选择排序分为三种:直接选择排序、树形选择排序(锦标赛排序)、堆排序,并对每种排序算法进行了分析,附带java实现代码。...
  • sysukehan
  • sysukehan
  • 2016-09-25 14:01:41
  • 3038

C++对10个数选择排序的2个问题分享

C++对10个数选择排序,升序输出 #include int main() { int a[10], i, j, k, t; //输入 for(i = 0; i < 10 ; i...
  • luojia0216
  • luojia0216
  • 2015-12-30 18:30:38
  • 386

C#实现的3种排序算法--冒泡排序、选择排序、插入排序

using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{  clas...
  • lynnlin1122
  • lynnlin1122
  • 2008-03-12 12:36:00
  • 766

数组排序 1、冒泡排序 2、选择排序 3、插入排序 4、不同的随机数

  • 2013年07月16日 17:10
  • 4KB
  • 下载

数据结构 - 树形选择排序 (tree selection sort) 详解 及 代码(C++)

树形选择排序 (tree selection sort) 详解 及 代码本文地址: http://blog.csdn.net/caroline_wendy算法逻辑: 根据节点的大小, 建立树, 输出树...
  • u012515223
  • u012515223
  • 2014-06-11 11:18:04
  • 2460

“深入理解”—选择排序算法

选择排序算法有两种:直接选择排序和堆排序
  • qq_25827845
  • qq_25827845
  • 2016-07-10 11:37:25
  • 7205

排序算法之树形选择排序

树形选择排序又名锦标赛排序,算法思想与体育比赛类似, 首先将n个数据元素两两分组,分别按关键字进行比较,得到n/2个比较的优胜者(关键字小者),作为第一步比较的结果保留下来, 然后对这n/2个数据元素...
  • wf131410000
  • wf131410000
  • 2015-08-19 21:28:31
  • 2491

《数据结构--排序》之选择排序

1.序 选择排序(selection sort)的基本思想是:每一趟在序列 sq[1],sq[2],...,sq[length]中选取关键字最大的记录作为序列最后一个记录,然后再从剩下的记录...
  • zhccl
  • zhccl
  • 2012-09-09 20:04:12
  • 3393

Java常见排序:(一)直接选择排序

常见的一些内部排序算法 排序:常见的也是基础的一些算法。 评价排序算法优劣的标准: 1.      时间复杂度:主要是分析关键字的比较次数和记录的移动次数。 2.      空间复杂度:分析排...
  • daguairen
  • daguairen
  • 2016-10-06 21:05:54
  • 648
    个人资料
    持之以恒
    等级:
    访问量: 2114
    积分: 314
    排名: 24万+
    文章分类
    最新评论