写在Selection Sort之前:
我们先来学习O(n2)时间复杂度的排序算法,对于排序算法,最优的是O(nlogn)时间复杂度的排序算法,那么我们为什么学习O(n2)的排序算法呢?
重视学习O(n^2)的排序算法原因:
- 相对基础
(很多时候,在遇到一个问题时,我们都要先尝试用简单的方法尝试解决,这个过程可以加深我们对问题本身的理解 进而提出更加复杂的方法或者来优化我们原来设想的简单解法,启发:要是对于一些面试问题一时没有思路,不妨先尝试简单的方法,虽然这个简单的方法有问题,但是我们先摆出来,摆的过程中可能就会想到优化的方法,同时也可让面试官看到我们思考问题的过程) - 编码简单,易于实现,是一些简单情景的首选
(有些情况下我们使用的不是高级程序设计语言,在底层我们可能使用汇编,这种情况下O(n^2)的排序算法便于实现就成为了首选) - 在一些特殊情况下,简单的排序算法更有效
- 简单的排序算法思想可以衍生出复杂的排序算法
(比如希尔排序是在插入排序下进行了一次优化实现) - 可作为子过程,改进更复杂的排序算法
注意:以上有不理解,不要太在意,相信通过后续学习的深入可对其有更深的理解
我们首先来学习选择排序(Selection Sort)
Selection Sort 思路:
对于给定的数组:
![](https://img.haomeiwen.com/i1451775/3811c779f4c83009.png)
首先我们在整个数组中找到第一名的位置(假设我们从小到大排),然后在数组中找到最小的数:
![](https://img.haomeiwen.com/i1451775/fd7c465b4ee6950d.png)
然后将1和现在的第一名的位置上的数(8)进行交换:
![](https://img.haomeiwen.com/i1451775/f667bbdfd4eca9ed.png)
经过这样的一次交换,1所处的位置就是其最终的位置了:(以后就不用管1了,省心的孩子....)
![](https://img.haomeiwen.com/i1451775/2671895ea3746290.png)
之后,我们在剩下的位置(即除去1的6到4)找到此时最小的数:2,把2和相应的第2个位置上的元素(6)进行交换:
![](https://img.haomeiwen.com/i1451775/47567eaf5de072f7.png)
此时1和2的顺序已好:
![](https://img.haomeiwen.com/i1451775/c37c39a379f1dc22.png)
此过程依此类推,继续在剩下的部分(6到4)找最小的数:
![](https://img.haomeiwen.com/i1451775/c08cc345d974865f.png)
![](https://img.haomeiwen.com/i1451775/2b36ce2b0e2f3c9c.png)
![](https://img.haomeiwen.com/i1451775/0356ae7fc4e3b813.png)
再看第4个:
![](https://img.haomeiwen.com/i1451775/fb18c9b01e1b09f4.png)
![](https://img.haomeiwen.com/i1451775/28cc712c63ba2540.png)
下面5:
![](https://img.haomeiwen.com/i1451775/fc05cfb36ba8aa8c.png)
![](https://img.haomeiwen.com/i1451775/f684422f277b42a4.png)
6:
![](https://img.haomeiwen.com/i1451775/6a45137acdfcd5e2.png)
![](https://img.haomeiwen.com/i1451775/ea8123ec96ec90f6.png)
7:
![](https://img.haomeiwen.com/i1451775/5ee03d2eab7f610a.png)
7不用动:(可以理解自己和自己进行了一次交换,结果是没有动)
![](https://img.haomeiwen.com/i1451775/577b293ec39985e4.png)
对于8:(和7情况一样)
![](https://img.haomeiwen.com/i1451775/bcbdbef9dd2ce9e7.png)
C++代码:
#include <iostream>
#include <algorithm>
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};
selectionSort(a,10);
for( int i = 0 ; i < 10 ; i ++ )
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
Java代码:
public class SelectionSort {
// 我们的算法类不允许产生任何实例
private SelectionSort(){}
public static void sort(int[] arr){
int n = arr.length;
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 , minIndex);
}
}
private static void swap(int[] arr, int i, int j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
public static void main(String[] args) {
int[] arr = {10,9,8,7,6,5,4,3,2,1};
SelectionSort.sort(arr);
for( int i = 0 ; i < arr.length ; i ++ ){
System.out.print(arr[i]);
System.out.print(' ');
}
System.out.println();
}
}
网友评论