Selection Sort的思想:

就是在一系列数字中先找到一个最小的放在所有数字的第一个位置上,然后再从余下的数字里面找最小个放在余下的数字里的第一个位置上。

例如:

在这段数据里面我们找到最小的数字是2,它的下标是2,那么我们把它移到最前面,就变成

如此往复,直到所有的的全部排序完毕才算结束。

为了实现这一排序我们需要:

①逐个找到最小值的下标

②将最小值与位置靠前的元素交换

③将余下的所有完成交换

在CS61B中,Josh Hug使用了递归的方式来解决这个问题(他真的好喜欢递归- -!),具体代码实现如下:

/**
* @author century
*/
public class Sort { public static void sort(String[] str) {
// find the smallest item
// move it to the front
// selection sort the rest (using recursion?)
sort(str,0);
} /**
* This is a helper method for the public method(sort)
* @param str
* @param start
*/
private static void sort(String[] str, int start) {
if (start == str.length) {
return;
}
int smallestIndex = findSmallest(str, start);
swap(str, start, smallestIndex);
sort(str, start + 1);
} /**
* return the smallest String item's index of this arr
* @param str
* @return smallestIndex
*/
public static int findSmallest(String[] str, int start) {
int smallestIndex = start;
for (int i = start; i < str.length; i += 1) {
int comp = str[i].compareTo(str[smallestIndex]);
if (comp < 0) {
smallestIndex = i;
}
}
return smallestIndex;
} /**
* swap the value of two different index
* @param arr
* @param a
* @param b
*/
public static void swap(String[] arr, int a, int b) {
String temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
} }

另外在这门课里面,Josh Hug教给学生应该如何编写测试来验证自己所编写的代码的正确性。

编写测试的步骤是:

先导入JUnit的包,然后再把JUnit包中Assert类的所有方法给导入,之后只需要在每个测试方法上加上一个@Test注解,然后在内部编写具体的测试方法就vans了。

下面代码是关于上面选择排序的测试类:

import org.junit.Test;
import static org.junit.Assert.*; /**
* @author century
*/
public class TestSort { /**
* Test the Sort.sort(String[] arr)
*/
@Test
public void testSort() {
String[] input = {"i","have","an","egg"};
String[] expected = {"an","egg","have","i"};
Sort.sort(input);
assertArrayEquals(input, expected);
} /**
* Test the method (Sort.findSmallest)
*/
@Test
public void testFindSmallest() {
String[] input = {"i","have","an","egg"};
int expected = 2; int actual = Sort.findSmallest(input, 0);
assertEquals(actual,expected);
} /**
* Test the method (Sort.swap)
*/
@Test
public void testSwap() {
String[] input = {"i","have","an","egg"};
String[] input2 = {"an","have","i","egg"};
int a = 0, b = 2; Sort.swap(input2, 0 , 2); assertArrayEquals(input, input2);
} }

选择排序的实现以及如何编写测试 #CS61B-sp18-3.1的更多相关文章

  1. python算法(一)基本知识&冒泡排序&选择排序&插入排序

    本节内容: 算法基本知识 冒泡排序 选择排序 插入排序 1. 算法基本知识 1.1 什么是算法? 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 ...

  2. C语言之实现函数返回一个数组,以及选择排序,还有折半查找。这是同学的一个作业。。。

    作业的具体要求如下: 编写一个完整的程序,实现如下功能.(1)    输入10个无序的整数.(2)    用选择排序法将以上接收的10个无序整数按从大到小的顺序排序.(3)    要求任意输入一个整数 ...

  3. XCode中的单元测试:编写测试类和方法(内容意译自苹果官方文档)

    当你在工程中通过测试导航栏添加了一个测试target之后, xcode会在测试导航栏中显示该target所属的测试类和方法. 这一章演示了怎么创建测试类,以及如何编写测试方法. 测试targets, ...

  4. Java基础(46):选择排序的Java封装(完整可运行)

    1 package lsg.ap.select; import java.util.Random; public class SelectSort { //选择排序 /** *@author: 梁山广 ...

  5. C语言实现冒泡排序法和选择排序法代码参考

    为了易用,我编写排序函数,这和直接在主调函数中用是差不多的. 我认为选择排序法更好理解!请注意 i 和 j ,在写代码时别弄错了,不然很难找到错误! 冒泡排序法 void sort(int * ar, ...

  6. 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)

    2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...

  7. 【算法】简单选择排序 O(n^2) 不稳定的 C语言

    简单选择排序 一.算法描述 假设序列中有N个元素: 第1趟找到第1到N个元素之间最小的一个,与第1个元素进行交换 第2趟找到第2到N个元素之间最小的一个,与第2个元素进行交换 第3趟找到第3到N个元素 ...

  8. Java版冒泡排序和选择排序

    一.理解说明 1.理解和记忆 冒泡排序:依次定位数组元素,每次只和相邻的且符合条件的元素交换位置. 选择排序:依次在数组的每个位置,通过逐个对比选择出最大或最小的元素. 2.知识点说明 (1)数组是引 ...

  9. 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现

    选择排序算法(Selection Sort)是排序算法的一种初级算法.虽然比较简单,但是基础,理解了有助于后面学习更高深算法,勿以勿小而不为. 排序算法的语言描述: 给定一组物体,根据他们的某种可量化 ...

随机推荐

  1. 如何通过Elasticsearch Scroll快速取出数据,构造pandas dataframe — Python多进程实现

    首先,python 多线程不能充分利用多核CPU的计算资源(只能共用一个CPU),所以得用多进程.笔者从3.7亿数据的索引,取200多万的数据,从取数据到构造pandas dataframe总共大概用 ...

  2. js中取el表达式问题

    例如常用的${pageContext.request.contextPath} 如果需要在js中用到 分两种情况: 如果js是直接写在jsp中 可以直接写el表达式 例如: 如果js是写在外部,jsp ...

  3. 基于ASP.NET core的MVC站点开发笔记 0x01

    基于ASP.NET core的MVC站点开发笔记 0x01 我的环境 OS type:mac Software:vscode Dotnet core version:2.0/3.1 dotnet sd ...

  4. 「疫期集训day10」玫瑰

    不管我们在怎么抵抗,德国都已经败了----失守苏瓦松后绝望中的德国兵 (貌似今天的题记和内容毫无关系) 觉得以后还是不要抱怨考试失误了,感觉没啥大用 T1暴搜/状压(然俄一看题很像刚写过的二分答案,上 ...

  5. List的isEmpty与==null的区别

    集合的判空一般判定方法 ArrayList<Person> list = null; System.out.println(null == list);//return true Syst ...

  6. day50 前端入门

    目录 一.引子 1 前端学习的历程 2 浏览器与http协议 2.1 浏览器窗口输入网址回车后发生了几件事 2.2 http协议 二.html入门 1 标签的分类 2 head内常用的标签 3 bod ...

  7. CTFHub_技能树_SQL注入Ⅱ

    SQL注入 MySQL结构 进行尝试: 尝试查看表名: 尝试查看列名: 发现无法直接输出: 使用时间注入脚本跑出结果: import requests import time session = re ...

  8. Mysql基础(十):MYSQL中使用事务的案例

    https://www.cnblogs.com/lsqbk/p/10145306.html 基本介绍 事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败 ...

  9. 05 drf源码剖析之认证

    05 drf源码剖析之认证 目录 05 drf源码剖析之认证 1. 认证简述 2. 认证的使用 3. 源码剖析 4. 总结 1. 认证简述 当我们通过Web浏览器与API进行交互时,我们可以登录,然后 ...

  10. CRM开发系列

    CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销售循环:新客户的 ...