每日一题之选择排序

选择排序

1、选择排序原理

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

简化一下原理,大概就是把数组中的元素分为已排序队列和待排序队列,每次在待排序队列中选择出最小的元素(或者最大的元素)放入到已排序队列中的尾端,依次重复操作,直至整个数组都是已排序队列。

2、选择排序的步骤

步骤图解

3、选择排序的代码实现

  • Java
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));
}
}

  • C++
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²)。

选择排序是一种不稳定的排序算法。选择排序每次都要找剩余未排序元素中的最小值,并和前面的元素交换位置,这样破坏了稳定性。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!