排序算法之 选择排序 及其时间复杂度和空间复杂度
2015-03-17 11:44
1846 查看
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)
基本思路:
1、外循环:循环每个位置(其实就是选择了这个位置,然后用内循环去选择一个合适的数,放到这个位置);
2、内循环:在无序元素中选择一个合适的数;
3、把第二步选中的数据放到第一步选中的位置上就可以了;
运行结果:
比较时间:T = (n-1))+ (n -2)+(n - 3).... + 1; ===>> T = [n*(n-1) ] / 2;
交换时间:最好的情况全部元素已经有序,则 交换次数为0;最差的情况,全部元素逆序,就要交换 n-1 次;
所以最优的时间复杂度 和最差的时间复杂度 和平均时间复杂度 都为 :O(n^2)
转载请注明作者和原文出处,原文地址:/article/1530625.html
若有不正确之处,望大家指正,共同学习!谢谢!!!
算法分析
其实选择排序是非常简单的,和冒泡排序有异曲同工之妙。就是把元素分成两部分,一部分是有序的,另外一部分是无序的;每次循环从无序的元素中选取一个元素放到有序的元素中,依次循环到最后把所有元素都放到了有序那一部分中(也就是无序部分,元素为零);基本思路:
1、外循环:循环每个位置(其实就是选择了这个位置,然后用内循环去选择一个合适的数,放到这个位置);
2、内循环:在无序元素中选择一个合适的数;
3、把第二步选中的数据放到第一步选中的位置上就可以了;
实现代码
#include<stdio.h> // 打印数组元素 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; }
运行结果:
时间复杂度
选择排序的时间复杂度不像前面几种排序方法那样,前面几种排序方法的时间复杂度不是一眼就能看出来的,而是要通过推导计算才能得到的。一般会涉及到递归和完全二叉树,所以推导也不是那么容易。但是选择排序就不一样了,你可以很直观的看出选择排序的时间复杂度:就是两个循环消耗的时间;比较时间: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)转载请注明作者和原文出处,原文地址:/article/1530625.html
若有不正确之处,望大家指正,共同学习!谢谢!!!
相关文章推荐
- 排序算法之 快速排序 及其时间复杂度和空间复杂度
- 排序算法之 插入排序、希尔(shell)排序 及其时间复杂度和空间复杂度
- 排序算法之 快速排序 及其时间复杂度和空间复杂度
- 排序算法之 基数排序 及其时间复杂度和空间复杂度
- 快速排序 及其时间复杂度和空间复杂度
- 排序算法之 快速排序 及其时间复杂度和空间复杂度
- 排序算法之 堆排序 及其时间复杂度和空间复杂度
- 排序算法之 冒泡排序 及其时间复杂度和空间复杂度
- 排序算法之 计数排序 及其时间复杂度和空间复杂度
- 排序算法之 堆排序 及其时间复杂度和空间复杂度
- 排序算法之 归并排序 及其时间复杂度和空间复杂度
- 实现一个排序算法,对0~n-1范围内的n个不重复的无序数组进行排序,时间复杂度为O(n),空间复杂度为O(1)。
- 排序算法的时间复杂度和空间复杂度
- 常用的排序算法的时间复杂度和空间复杂度
- 常见排序算法以及时间复杂度和空间复杂度
- 常用的排序算法的时间复杂度和空间复杂度
- 常用的排序算法的时间复杂度和空间复杂度
- 排序算法的稳定性、时间和空间复杂度
- 常用的排序算法的时间复杂度和空间复杂度
- 常用的排序算法的时间复杂度和空间复杂度