选择排序
1、选择排序原理
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
简化一下原理,大概就是把数组中的元素分为已排序队列和待排序队列,每次在待排序队列中选择出最小的元素(或者最大的元素)放入到已排序队列中的尾端,依次重复操作,直至整个数组都是已排序队列。
2、选择排序的步骤
3、选择排序的代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import java.util.Arrays;
public class SelectionSort {
private static void selectionSort(int[] nums) { for (int i = 0, n = nums.length; i < n - 1; ++i) { int minIndex = i; for (int j = i; j < n; ++j) { if (nums[j] < nums[minIndex]) { minIndex = j; } } swap(nums, minIndex, i); } }
private static void swap(int[] nums, int i, int j) { int t = nums[i]; nums[i] = nums[j]; nums[j] = t; }
public static void main(String[] args) { int[] nums = {1, 2, 7, 9, 5, 8}; selectionSort(nums); System.out.println(Arrays.toString(nums)); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <iostream> #include <vector>
using namespace std;
void selectsort( vector<int> & vec ) { for ( int i = 0; i < vec.size() - 1; i++ ) { int minidx = i; for ( int j = i + 1; j < vec.size(); j++ ) { if ( vec[minidx] > vec[j] ) { minidx = j; } }
swap( vec[i], vec[minidx] ); } }
int main( void ) { vector<int> vec = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; selectsort( vec ); printvec( vec, "after insert sort" ); return(0); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| @Test public void kuaipai() { int[] str = new int[]{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; int length=str.length; int min; int i; int j; for (i=0;i<length;i++) { min=i; for(j=i+1;j<length;j++) { if(str[j]<str[min]) { min=j; } } if (min!=i) { int temp; temp=str[min]; str[min]=str[i]; str[i]=temp; } } for(i=0;i<length;i++) { System.out.println(str[i]); } }
|
4、选择排序的算法分析
空间复杂度 O(1),时间复杂度 O(n²)。
选择排序是一种不稳定的排序算法。选择排序每次都要找剩余未排序元素中的最小值,并和前面的元素交换位置,这样破坏了稳定性。