排序算法之 选择排序 及其时间复杂度和空间复杂度

        选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)


算法分析

        其实选择排序是非常简单的,和冒泡排序有异曲同工之妙。就是把元素分成两部分,一部分是有序的,另外一部分是无序的;每次循环从无序的元素中选取一个元素放到有序的元素中,依次循环到最后把所有元素都放到了有序那一部分中(也就是无序部分,元素为零);

        基本思路:

        1、外循环:循环每个位置(其实就是选择了这个位置,然后用内循环去选择一个合适的数,放到这个位置);

        2、内循环:在无序元素中选择一个合适的数;

        3、把第二步选中的数据放到第一步选中的位置上就可以了;


实现代码

#include
 // 打印数组元素
 void print_array(int *array, int length)
 {
     int index = 0;
     printf("array:\n");
     for(; index < length; index++){
         printf(" %d,", *(array+index));
     }   
     printf("\n\n");
 }
 
 void selectSort(int array[], int length)
 {
     int i, j, tmp;
     // 条件判断
     if (1 >= length) return;
     // 循环每个位置,为该位置选择合适数据
     for (i = 0; i < length; i++){
         tmp = i;
         for (j = i; j < length; j++){
             if (array[tmp] < array[j]) tmp = j;// 选择合适数据
         }   
         if (i != tmp){   // 把选择好的数据放到外循环中选中的位置中
             j = array[tmp];
             array[tmp] = array[i];
             array[i] = j;
         }   
     }   
 }
 
 int main(void)
 {
     int array[12] = {1,11,12,4,2,6,9,0,3,7,8,2};
     print_array(array, 12);
     selectSort(array, 12);
     print_array(array, 12);
     return 0;
 }
 

 运行结果:

 排序算法之 选择排序 及其时间复杂度和空间复杂度_第1张图片


时间复杂度

        选择排序的时间复杂度不像前面几种排序方法那样,前面几种排序方法的时间复杂度不是一眼就能看出来的,而是要通过推导计算才能得到的。一般会涉及到递归和完全二叉树,所以推导也不是那么容易。但是选择排序就不一样了,你可以很直观的看出选择排序的时间复杂度:就是两个循环消耗的时间;
       比较时间:T = (n-1))+ (n -2)+(n - 3).... + 1;  ===>>  T =  [n*(n-1) ] / 2;
      交换时间:最好的情况全部元素已经有序,则 交换次数为0;最差的情况,全部元素逆序,就要交换 n-1 次;
       所以最优的时间复杂度  和最差的时间复杂度   和平均时间复杂度  都为 :O(n^2)

空间复杂度

        空间复杂度,最优的情况下(已经有顺序)复杂度为:O(0) ;最差的情况下(全部元素都要重新排序)复杂度为:O(n );;平均的时间复杂度:O(1)

        转载请注明作者和原文出处,原文地址:http://blog.csdn.net/yuzhihui_no1/article/details/44339673
        若有不正确之处,望大家指正,共同学习!谢谢!!!

你可能感兴趣的:(面试,排序算法,数据结构)