每次循环把最小的值往前移
C++代码:
Sorter.hpp
#ifndef _Algorithm_Sorter_H_#define _Algorithm_Sorter_H_templateclass Sorter{public: static void selectionSort(Item a[], int l, int r); static void show(Item a[], int length);private: static void exch(Item &A, Item &B);};template void Sorter - ::show(Item a[], int length){ for (int i = 0; i < length; i++) cout << a[i] << " "; cout << endl;}template
void Sorter - ::exch(Item &A, Item &B){ Item t = A; A = B; B = t;}template
void Sorter - ::selectionSort(Item a[], int l, int r){ for (int i = l; i < r; i++) { int min = i; for (int j = i + 1; j <= r; j++) if (a[j] < a[min]) min = j; exch(a[i], a[min]); }}#endif
SorterTest.h
#ifndef _Algorithm_Sorter_Test_H_#define _Algorithm_Sorter_Test_H_#include "../TestBase.h"class SorterTest : public TestBase{public: SorterTest(const string &c, const string &d) : TestBase(c, d) { } void run();private: void selectionSortTest();};#endif
SorterTest.cpp
#include#include #include "SorterTest.h"#include "Sorter.hpp"using namespace std;void SorterTest::selectionSortTest(){ int *a = new int[10]; for (int i = 0; i < 10; i++) a[i] = 1000 * (1.0*rand() / RAND_MAX); cout << "before sorting..." << endl; Sorter ::show(a, 10); Sorter ::selectionSort(a, 0, 9); cout << "after sorting..." << endl; Sorter ::show(a, 10);}void SorterTest::run(){ printStart("selectionSortTest()"); selectionSortTest(); printEnd("selectionSortTest()");}
运行结果:
---------------- selectionSortTest(): Run Start ----------------before sorting...1 563 193 808 585 479 350 895 822 746after sorting...1 193 350 479 563 585 746 808 822 895---------------- selectionSortTest(): Run End ----------------
Java代码:
package zeus.algorithm.sort;public class Sorter { public static void selectionSort(Comparable[] a) { // Sort a[] into increasing order. int N = a.length; // array length for (int i = 0; i < N; i++) { // Exchange a[i] with smallest entry in // a[i+1...N). int min = i; // index of minimal entr. for (int j = i + 1; j < N; j++) if (less(a[j], a[min])) min = j; exch(a, i, min); } } private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } private static void exch(Comparable[] a, int i, int j) { Comparable t = a[i]; a[i] = a[j]; a[j] = t; } private static void show(Comparable[] a) { // Print the array, on a single // line. for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); System.out.println(); } private static boolean isSorted(Comparable[] a) { return isSorted(a, 0, a.length - 1); }//is the array sorted from a[lo] to a[hi] private static boolean isSorted(Comparable[] a, int lo, int hi) { for (int i = lo + 1; i <= hi; i++) if (less(a[i], a[i - 1])) return false; return true; } public static void main(String[] args) { System.out.println("********* Selection Sort *********"); String[] a = { "23", "12", "9", "1", "8", "20" }; selectionSort(a); System.out.println("Sort By String:"); show(a); System.out.println("--------------------------------------------"); Integer[] b = { 23, 12, 9, 1, 8, 20 }; selectionSort(b); System.out.println("Sort By Integer:"); show(b);}
运行结果:
********* Selection Sort *********
Sort By String:1 12 20 23 8 9 --------------------------------------------Sort By Integer:1 8 9 12 20 23