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. BZOJ 4055 Misc

    原题传送门 比较复杂的一道DP. 设两点(i,j)之间最短路为dis[i][j],则 可转化为: 将该式前后分立,可得: 其中,可以单独求出,后面的部分则需要DP. 设为b(x),枚举i,并计算出从i ...

  2. 我的第一个Maven工程

    橘子松今天学了下maven 跑了个demo 其中也发现一些问题 并解决了 环境搭建 开始新建会有红叉. 在pom.xml里加入从你的本地仓库加入servlet-api.jar 如果没有 http:// ...

  3. 转载---最简单的JavaScript模板引擎

    转载自:http://www.cnblogs.com/dolphinX/p/3489269.html,http://blog.jobbole.com/56689/

  4. 嗨,This is G-Aurora

    嗨,This is G-Aurora   分享让我们得以持续 在很长一段时间里,自己都是将学习笔记整理到自己的磁盘或者网盘中.大概那个时候还对"开源与分享"不太感冒.但后来越来越觉 ...

  5. CF 938D Buy a Ticket 题解

    题目 Musicians of a popular band "Flayer" have announced that they are going to "make t ...

  6. 通过手写服务器的方式,立体学习Http

    前言 Http我们都已经耳熟能详了,而关于Http学习的文章网上有很多,各个知识点的讲解也可说是深入浅出.然而,学习过后,我们对Http还是一知半解.问题出在了哪? Http是一个客户机与服务器之间的 ...

  7. 简单的MVC框架

    效果图: 源码下载:https://github.com/doyoulaikeme/DotNetSample/tree/master/DotNetSample4/easyMVCFramework

  8. postman 进阶技巧

    cookie 清除缓存 code 生成接口自动化测试脚本 响应部分 pretty 响应以json或xml显示 raw 响应以文本显示 preview 以HTML网页行驶显示 断言 断言:用于判断接口请 ...

  9. SpringMVC如何从默认的index.jsp页面跳转到其他页面

    最近学习SpringMVC时,想要做一个登录页面Login.jsp,发现Tomcat服务器默认进入的页面是WEB-INF/index.jsp,查询资料发现如果修改默认页面,还需要修改Tomcat文件目 ...

  10. day20 函数收尾+面向过程+模块

    目录 一.算法(二分法) 二.面向过程与函数式 1 编程范式/思想 2 面向过程 3 函数式 3.1 匿名函数与lambda 三.模块 1 什么是模块 2 为何要有模块 3 怎么用模块 3.1第一次导 ...