一天一学数据结构之选择排序

  每次 从待排序序列中选择出一个最大(或者最小)的记录添加到有序序列的后面即为选择排序。

  选择排序主要有:简单选择排序树形选择排序堆排序

1、简单选择排序

基本思路:重复进行n趟选择,第i趟通过n-i次记录的比较,在n-i+1个记录中选取最小(或最大)的记录与第i个记录进行交换。

void selectSort(int arr[],int n){
    int outer,inner;
    int min;
    for(outer=1;outer<=n;outer++ ){
        min = outer;
        for(inner=outer;inner<=n;inner++)
          if(arr[inner]<arr[min])
            min = inner;
        if(min != outer){
            arr[0] = arr[min];
            arr[min] = arr[outer];
            arr[outer] = arr[0];
        }

    }
}

2、堆排序

堆:(1) 堆是完全二叉树;

  (2) 小根堆:每个结点的值小于等于左右孩子结点的值;大根堆:每个结点的值大于等于左右孩子结点的值。

堆排序:对于大根堆来说,堆顶记录即是整个序列的最大值。我们将待排序序列构造成一个堆,选出堆顶记录(最大值),然后把剩下的记录重新调整成堆,再选择出堆顶记录(次大值),依次下去,直到堆中只剩下一个记录。

void shiftHeap(int arr[],int k,int m){
    int i = k;
    int j = i * 2;
    while(j <= m){
        if(j<m && arr[j]<arr[j+1]) j++;
        if(arr[i]>arr[j])
          break;
        else{
            arr[0] = arr[i];
            arr[i] = arr[j];
            i = j;
            j = 2 * i;
        }
    }
}

void heapSort(int arr[],int n){
    int index;
    for(index = n/2;index>=1;index--)
      shiftHeap(arr,index,n);
    for(index=1;index<n;index++){
        arr[0] = arr[1];
        arr[1] = arr[n-index+1];
        arr[n-index+1] = arr[0];
        shiftHeap(arr,1,n-index);
    }
}

3、总结

简单选择排序:时间复杂度为o(n2),是不稳定排序。

堆排序:时间复杂度为o(nlog2n),是不稳定排序。

堆排序其实就是每次选择待排序序列中的最大值(或最小),它与简单选择排序的区别就是:简单选择排序是通过比较n-i+1个记录来选择最值,而堆排序是通过构造堆来选择最值。所以堆排序最重要的就是调整成堆的过程。

时间: 2024-10-10 01:19:42

一天一学数据结构之选择排序的相关文章

数据结构 - 简单选择排序(simple selection sort) 详解 及 代码(C++)

数据结构 - 简单选择排序(simple selection sort) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28601965 选择排序(selection sort) : 每一趟在n-i+1个记录中选取关键字最小的记录作为有序序列中第i个记录. 简单选择排序(simple selection sort) : 通过n-i次关键字之间的比较, 从n-i+1个记录中选出关键字最小的记录, 并和第i个记录交换. 选择排序需

大话数据结构——简单选择排序

在学了冒泡排序后,会发觉这种算法就是不断比较交换.虽简单直接,显然给人一种繁琐的感觉.那有没有更好一点的算法呢?这当然有啦,没有就糟糕透了 :-P 这篇文章介绍一种较冒泡要好的排序算法:简单选择排序 看到“选择”这两字估计也猜到一二了.没错,这种算法的思想就是:待找到了最适合的那位数的位置我才选择与它进行交换 这样做,我们大大省下了很多不必要的交换.因为在代码编写中,交换函数是经常使用,所以一般将其封装成一个函数进行调用.如果存在非常多不必要的交换操作,这就产生了非常多不必要的函数调用.要知道,

【从0到1学算法】选择排序

又到了算法时间,今天我们来学第二种算法---选择排序.这里有个表格,记录了乐队及其作品的播放次数,如下: 要将它们按播放次数从多到少排序,要怎么做呢?有一种方法是这样子的,遍历列表,找出播放次数最多的乐队,将这个乐队添加到一个新的列表中. 再次这样做,找出第二多的乐队. 循环上述做法,最终便可得到一个有序列表. 上述这种算法便是选择排序法,n次遍历列表选出最大/小进行排序.我们用代码来一遍呗.题目:对一个数组从小大排序 # 找到最小值的索引 def?find_smallest(arr): ? ?

数据结构之——选择排序

选择排序的基本思想为:每一趟(例如第i趟)在后面的n-i+1(i=1,2,3,…...,n-1)个待排序元素中选取关键字最小的元素,作为有序序列的第i个元素,直到n-1趟做完,待排序元素只剩下一个,就不用选了,序列也排序完毕.选择排序主要有简单选择排序和堆排序,下面分别就这两种排序算法进行讨论. 1.简单选择排序 从上面选择排序的思想中可以很直观的得出简单选择排序的算法思想:假设排序列表为L[1……n],第i趟排序从L[i……n]中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的

数据结构之选择排序--简单选择排序

排序思路:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环.算法实现: public static void selectSort(int arr[]){ int temp; for(int i = 0;i < arr.length-1; i ++){//有N个元素只需比较N-1次 int min = i;//记住初始位置 for(int j = i+1; j < arr.length; j ++){//在 [i+1,arr.

算法与数据结构之选择排序(C语言)

1 #include<stdio.h> 2 #include<stdlib.h> 3 void SelectSort(int *a,int n);//预声明要调用的函数 4 int main(void) 5 { 6 int k; 7 int x[10]={2,4,6,8,0,1,3,5,7,9}; 8 for(k=0;k<10;k++) 9 printf("%d",x[k]); 10 printf("\n"); 11 SelectSor

【数据结构】选择排序算法示例

基本选择排序编辑 排序算法即解决以下问题的算法: 输入 n个数的序列<a1,a2,a3,...,an>. 输出 原序列的一个重排<a1*,a2*,a3*,...,an*>:,使得a1*<=a2*<=a3*<=...<=an* 排序算法有很多,包括插入排序,冒泡排序,堆排序,归并排序,选择排序,计数排序,基数排序,桶排序,快速排序等.插入排序,堆排序,选择排序,归并排序和快速排序,冒泡排序都是比较排序,它们通过对数组中的元素进行比较来实现排序,其他排序算法则是

每天学点java_java选择排序

package com.czj; public class SelectSort { /** * 选择排序,对sortArray传入的数组进行从小到大排序. * 思路就是 找到数组中最小的值,放到数组第一个位置,然后找到第二个最小值,放到第二个位置 * @param sortArray */ public void selectSort(int[] sortArray){ int last=sortArray.length; //last为数组长度 for(int i=0;i<last;i++)

数据结构_选择排序

选择排序介绍 选择排序(Selection sort)是一种简单直观的排序算法.它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置:接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕.  总结:两个for循环=一个for喜欢i=0-(n-1)+一个for循环寻找比i小的数组的坐标用min存起来+一个交换的过程 /* * 设置一个参考存储坐标,和冒泡的区别是不需要频繁的移动交换,它只需要找坐标