选择排序
Selection sort的复杂度分析
什么是复杂度?
简单的来说当我们需要衡量算法的优异程度的时候就需要用到它。。。
对一个算法来说,我们一般用时间和空间这两个维度来衡量它。也就是算法的执行时间,以及算法需要占用多大的空间。。。
我们一般用O来表示复杂度。。。。
而O也有一项特殊的能力它能舍弃一个算法的所有低次项与常数,比如说有一个算法的复杂度为 7 n 3 + n 2 + n + 7 {7n^3+n^2+n+7} 7n3+n2+n+7,那么当我们需要表述他的复杂度的时候就可以说这个算法的时间复杂度为O( n 3 {n^3} n3)。也就是说可以删除 n 2 + n + 7 {n^2+n+7} n2+n+7 和常数7。
冒泡排序的时间复杂度O( n 2 {n^2} n2)
我们一般用最坏时间复杂度来衡量算法,所以一般所有算法时间复杂度说的都是最坏时间复杂度。
时间复杂度分析
而时间复杂度又分为
- 最坏时间复杂度
- 平均时间复杂度
- 最优时间复杂度
选择排序的最坏时间复杂度O( n 2 {n^2} n2)
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。举个例子。
举个例子如[5,8,7,9,4]
第一次执行遍历5>8将5存起来5>7存起来5>9存起来5<4四是最小值所以放到第一个位置[4,8,7,9,5]
第二次执行遍历8>7将7存起来7=7存起来7<9存起来7>5五是最小值放到第二个位置[4,5,7,9,8]
第三次执行遍历7<9将7存起来7<8将7存起来无变化[4,5,7,9,8]
第四次执行遍历9>8将8存起来8是最小值所以将8放到第4个位置[4,5,7,8,9]
空间复杂度分析
比较次数 O ( n 2 ) {\displaystyle O(n^{2})} O(n2),比较次数与关键字的初始状态无关,总的比较次数 N = ( n − 1 ) + ( n − 2 ) + . . . + 1 = n × ( n − 1 ) / 2 N = ( n − 1 ) + ( n − 2 ) + . . . + 1 = n × ( n − 1 ) / 2 {\displaystyle N=(n-1)+(n-2)+...+1=n\times (n-1)/2}N=(n-1)+(n-2)+...+1=n\times (n-1)/2 N=(n−1)+(n−2)+...+1=n×(n−1)/2N=(n−1)+(n−2)+...+1=n×(n−1)/2。交换次数 O ( n ) {\displaystyle O(n)} O(n),最好情况是,已经有序,交换0次;最坏情况是,逆序,交换 n − 1 {\displaystyle n-1} n−1次。交换次数比冒泡排序较少,由于交换所需CPU时间比比较所需的CPU时间多, n {\displaystyle n} n值较小时,选择排序比冒泡排序快。
Selection sort的编程实现思路
Selection sort的实现思路
这里是从小到大排列,把小改成大切换一下就能得到从大到小的排列算法。。。。。
- 在传入数组之后我们首先就需要遍历数组(也就是第一个for循环的作用)
- 寻找这个数组中的最小的这个数字(也就是第二个for循环作用)
- 判断下一个二个数字是否比最小值大以此类推直到找到最小的数字记录它的下标(就默认第一个数字位置是已经排好了)
- 交换最小值的位置(第一次换到第一个位置第二次换到第二个位置以此类推)
public static void SelectionSort(int[] arr, int len){
int i,j,temp;
for(i = 0 ; i< len-1 ; i++){
int min = i;
for(j = i+1; j <len ;j++){
if(arr[j]<arr[min]){
min = j;
}
}
if(i!=min){
temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
}