排序基础--选择排序

算法描述:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换;接着对不包括第一个记录以外的其他记录进行第二轮比较,得到最小的记录并与第二个记录进行位置交换;重复该过程,直到进行比较的记录只有一个时为止。

Java实现


public class Selection_Sort {

	/**
	 * 算法描述:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换;
	 * 接着对不包括第一个记录以外的其他记录进行第二轮比较,得到最小的记录并与第二个记录进行位置交换; 重复该过程,直到进行比较的记录只有一个时为止。
	 * 
	 * @param args
	 */
	public static void main(String[] args) {

		int[] n = new int[10];
		// 随机生成数组
		for (int i = 0; i < n.length; i++) {
			n[i] = (int) (Math.random() * 100);
		}

		selectionSort(n);
		for (int i : n)
			System.out.print(i + " ");
	}

	public static void selectionSort(int arr[]) {
		int n = arr.length;
		for (int i = 0; i < n; i++) {
			// 寻找[i, n)区间里的最小值
			int minIndex = i;// 用来记录最小值的索引位置,默认值为i

			for (int j = i + 1; j < n; j++)
				if (arr[j] < arr[minIndex])
					minIndex = j;  // 遍历 i+1~length 的值,找到其中最小值的位置
			
			// 交换当前索引 i 和最小值索引 minIndex 两处的值
			if (minIndex != i) {
				int tmp = arr[i];
				arr[i] = arr[minIndex];
				arr[minIndex] = tmp;
			}
		}
	}

}

C++实现

#include <iostream>
#include <algorithm>
#include "SortTestHelper.h"

using namespace std;

void selectionSort(int arr[], int n){

    for(int i = 0 ; i < n ; i ++){
        // 寻找[i, n)区间里的最小值
        int minIndex = i;
        for( int j = i + 1 ; j < n ; j ++ )
            if( arr[j] < arr[minIndex] )
                minIndex = j;

        swap( arr[i] , arr[minIndex] );
    }

}

int main() {

    // int a[10] = {10,9,8,7,6,5,4,3,2,1};
    int n= 10;
    int *arr = SortTestHelper::generateRandomArray(n,0,n);
    selectionSort(arr,n);
    SortTestHelper::printArray(arr,n);

    delete[] arr;

    return 0;
}
#ifndef SELECTIONSORT_SORTTESTHELPER_H
#define SELECTIONSORT_SORTTESTHELPER_H

#include <iostream>
#include <ctime>
#include <cassert>
using namespace std;

namespace SortTestHelper{
    int* generateRandomArray(int n,int rangeL,int rangeR){
        
        assert(rangeL<=rangeR);
        int *arr=new int[n];
        srand(time(NULL));
        for(int i=0;i<n;i++)
            arr[i] = rand()%(rangeR-rangeL+1) + rangeL;
        return arr;
    }

    template<typename T>
    void printArray(T arr[],int n){
        for( int i = 0 ; i < n ; i ++ )
            cout<<arr[i]<<" ";
        cout<<endl;
        return;
    }
}

#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值