算法 - 排序 - 选择排序

每次循环把最小的值往前移

C++代码:

Sorter.hpp

#ifndef _Algorithm_Sorter_H_
#define _Algorithm_Sorter_H_

template <typename Item>
class 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 <typename Item>
void Sorter<Item>::show(Item a[], int length)
{
    for (int i = 0; i < length; i++)
        cout << a[i] << " ";
    cout << endl;
}

template <typename Item>
void Sorter<Item>::exch(Item &A, Item &B)
{
    Item t = A; A = B; B = t;
}

template <typename Item>
void Sorter<Item>::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 <vector>
#include <iostream>
#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<int>::show(a, 10);

    Sorter<int>::selectionSort(a, 0, 9);

    cout << "after sorting..." << endl;
    Sorter<int>::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 746
after 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

时间: 2024-11-18 07:45:49

算法 - 排序 - 选择排序的相关文章

JavaScript ,Python,java,Go系列算法之选择排序

常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是O(n2) 的时间复杂度.所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧.通俗来说就是你们中间谁最小谁就出列,站到队列的最后边,然后继续对着剩余的无序数组说你们中间谁最小谁就出列,站到队列的最后边,一直到最后一个,继续站到最后边,这样数组就有了顺序,从小到大. 1.算法步骤 首先在未排

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

选择排序没什么好说的,直接上代码吧 public class SelectSort { public void selectSort(int[] in) { int inLength = in.length; int minIndex = 0; for (int i = 0; i < inLength; i++) { minIndex = i; for (int j = i + 1; j < inLength; j++) { if (in[j] < in[minIndex]) { min

算法大神之路----排序(选择排序法)

选择排序法,顾名思义,就是把特定的数据选择出来进行排序. 选择排序法有两种方式 在所有的数据中,当由大到小排序,那么就将最大值放到第一个位置 如果由小到大排序,那么就将最小值放到第一个位置 以由小到大排序举例,当排序时候,扫描整个数据,拿第一个依次与其他做比较,如果其他数据比第一个大,或者相等,那么就不交换,如果其他数据比第一个数小,那么就交换二者的位置,扫描结束后,则从第二个数开始,依次扫描. 方法分析 无论是最坏还是最好情况,甚至是平均情况下,都需要对全部数据进行扫描,找到最大或最小值,因此

数据结构排序算法之选择排序

今天继续介绍一种排序算法:选择排序. 选择排序的基本思想就是从待排序列中选择出最小的,然后将被选出元素和序列的第一个元素互换位置(当前默认是升序排列),则互换完成后第一个元素就是整个序列的最小的元素,则一次选择排序结束.然后我们从剩下的子序列中选择出最小的,然后将该被选出来的元素和该子序列的第一个元素(即整个序列的第二个元素)互换位置,则当前整个序列的第二个元素就是当前序列中的次最小值,第二次选择排序结束.以此类推,直到该待排序列只剩下一个元素后,则整个序列有序. 具体过程如下图所示: 下面就不

排序算法之选择排序

一. 算法描述 选择排序:在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成. 二. 算法分析 平均时间复杂度:O(n2) 空间复杂度:O(1)  (用于交换和记录索引) 稳定性:不稳定 (比如序列[5, 5, 3]第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面) 三. 算法实现

java结构与算法之选择排序

一 .java结构与算法之选择排序 什么事选择排序:从一组无序数据中选择出中小的的值,将该值与无序区的最左边的的值进行交换. 简单的解释:假设有这样一组数据 12,4,23,5,找到最小值 4 放在最右边,然后找到 5 放在  4 的后面,重复该操作. 选择排序参考代码: public class ChooseSort { int[] array = null; @Test public void testPopSort() { array = new int[5]; array[0] = 45

直接插入排序 快速排序算法 直接选择排序

以下三个验证性实验都做. (1)直接插入排序算法验证. (2)快速排序算法验证. (3)直接选择排序算法验证. #include<iostream> #include<cstdlib> using namespace std; class dishizhang { public: int a[10]; int b[10]; dishizhang() { int tem; for(int i = 0 ; i < 10 ; i ++) { while(1) { int flag

Java中的经典算法之选择排序(SelectionSort)

Java中的经典算法之选择排序(SelectionSort) a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录.基于此思想的算法主要有简单选择排序.树型选择排序和堆排序.(这里只介绍常用的简单选择排序) b) 简单选择排序的基本思想:给定数组:int[] arr={里面n个数据}:第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数

常用算法之----选择排序

Java中的经典算法之选择排序(SelectionSort) a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录.基于此思想的算法主要有简单选择排序.树型选择排序和堆排序.(这里只介绍常用的简单选择排序) b) 简单选择排序的基本思想:给定数组:int[] arr={里面n个数据}:第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数

【排序算法】选择排序(Selection sort)

0. 说明 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对 n 个元素的表进行排序总共进行至多 n-1 次交换.在所有的完全依