《算法导论》习题2.2-2 选择排序

伪代码:



SELECTION-SORT1 for i=2 to A.length-1
2   max = A[i]
3   mark = i
4   for j=i+1 to A.length
5      if A[j]>max
6         max=A[j]
7         mark = j
8   A[mark]=A[i]
9   A[i] = max

Java 实现:

public class SelectionSort {

    public static double [] sort(double [] A)
    {
        for(int i = 0; i<A.length-1; i++)
        {
            double max = A[i];
            int mark = i;
            for(int j =i+1;j<A.length;j++)
              if(A[j]>max)
              {
                  max = A[j];
                  mark = j;
              }
            A[mark] = A[i];
            A[i]=max;
        }
        return A;
    }
    public static void main(String[] args) {
        double [] A = {1.3, 5 ,2, 6.9, 2.0,7.8,4.3};
        A = SelectionSort.sort(A);
        for(double a:A)
            System.out.print(a+" ");
    }
}
时间: 2024-08-17 15:25:55

《算法导论》习题2.2-2 选择排序的相关文章

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

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

算法效率的分析--【以选择排序与冒泡排序为基础】

在前面我们实现了选择排序与冒泡排序的具体实现,现在我们从数学的角度分析下算法的效率问题: 首先我们把两种排序算法的概念重温一遍: 选择排序:在每一轮中,找出最小的元素放在他最终的位置.挺起来有些别扭,我们举个实例: eg:        8, 5,1, 20, 6, 3 1ed······  1, 5,8, 20, 6, 3 2ed······  1, 3, 8,20, 6,5 3ed······  1, 3,5, 20, 6, 8 4ed······  1, 3,  5, 6,  20,8 5

算法导论学习之快排+各种排序算法时间复杂度总结

快排是一种最常用的排序算法,因为其平均的时间复杂度是nlgn,并且其中的常数因子比较小. 一.快速排序 快排和合并排序一样都是基于分治的排序算法;快排的分治如下: 分解:对区间A[p,r]进行分解,返回q,使得A[p–q-1]都不大于A[q] A[q+1,r]都大于A[q]; 求解:对上面得到的区间继续递归进行快排 合并:因为快排是原地排序,所以不需要特别的合并 从上可以看出最重要的就是分解函数,其按关键值将数组划分成3部分,其具体实现的过程见代码注释. 我们一般取数组的最后一个元素作为划分比较

从头看算法导论 习题2.3-7 深入分析

题目:请给出一个时间复杂度为nlogn的算法,使之能够在给定一个由n个整数的构成的整合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素. 算法思想:1.先运用合并排序进行排序 O(nlgn),2.然后运用二分查找法寻找y,y = x - a[i],算法的时间复杂度小于nlogn,所以总的时间复杂度还是nlogn. 批注:该思想,不是最好的(从简洁.时间复杂度上得到结论),不喜勿喷. 代码如下: 1 #include <stdio.h> 2 #include <stdlib.h

排序算法(三)冒泡、选择排序的Python实现及算法优化详解

说在前面 最近一年太忙,博客长草了.近日用Python实现了常用排序算法,供大家参考. Java版本排序算法及优化,请看以前的文章. <排序算法之简单排序(冒泡.选择.插入)> <排序算法(二)堆排序> 1.排序概念 这里不再赘述,请参看前面2篇文章 2.简单排序之冒泡法Python实现及优化 原理图 2.1.基本实现 num_list = [     [1, 9, 8, 5, 6, 7, 4, 3, 2],     [1, 2, 3, 4, 5, 6, 7, 8, 9] ] nu

算法之LOWB三人组之选择排序

选择排序 思想是在一个列表中每次循环一遍,拿到最小值,接着再从剩下的无序区中继续拿最小值,如此循环,直到结束. # 最简单的一个选择排序,循环一个列表,拿到最小值,添加到一个新列表,之后在列表中删除这个最小值,继续再剩下的值中找最小值,往复循环. def select_sort_simple(li): new_li = [] for i in range(len(li)): min_val = min(li) new_li.append(min_val) li.remove(min_val) r

算法总结之 单链表的选择排序

给定一个无序单链表的头节点head,实现单链表的选择排序 要求额外空间复杂度O(1) 思路: 既然额外空间复杂度O(1),就不能把链表装进容器,排好序后再从新链接,而是要求面试者在原链表上利用有限几个变量完成选择排序的过程. 选择排序是从未排序的部分找到最小值,然后放到排好序部分的尾部. 1 开始时默认真个链表都是未排序的部分,对于找到的最小值节点肯定是整个链表的最小值节点,将其设置为新的头节点记:newHead 2 每次在排序的部分中找到最小值的节点,然后哦把这个节点从未排序的链表删除,删除的

算法导论习题 通用汇点

来自习题22.1-6 给出O(V)时间算法判断有向图G是否存在一个通用汇点(universal sink).通用汇点指的是入度为|V|-1,出度为0的节点. 思路: 考虑图的邻接矩阵A,假设i为通用汇点,则对于0<=j<n,有A[i][j]=0,且对于所有0<=k<n and k != i,有A[k][i] = 1,注意这里k!=i 相当于在子矩阵A[0..i][0..i]的右边和下边造了一个围墙,最下边全是0,最右边除了右下角外全是1 那么可以令游标从矩阵左上角开始,遇1向下,逢

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

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

【算法导论 in lambda】并归排序

并归排序的过程就是一个先拆再合并的过程,先拆到全是不能再拆的最小数组,然后组与组之间合并,排序的过程在合并的过程中执行. 所以整个算法分两部分,split和merge 先说merge吧,将两个数组合并为新数组,符合从大到小. public int[] merge(int[] c1, int[] c2) { int[] ret = new int[c1.length + c2.length]; for (int i = 0, j = 0, index = 0; i < c1.length || j