选择排序

来源:互联网 发布:淘宝网找新疆核桃 编辑:程序博客网 时间:2024/05/29 09:50

1.序言

选择排序总体来说比较简单,看了网上的博客也非常清晰,有从实际例子入手的,也有讲解具体操作步骤的,但对我来说都不足以实现直观的从原理转换为代码,所以在此记录下如何从选择排序的思想转换成代码的。

2.问题描述

参见冒泡排序的问题描述。

3.问题分析

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

4.前提条件

a.此处我们选择使用标准C语言。

b.此处假设我们需要排序的nge数均为整型。

5.实现步骤

a.数据存储,采用整型数组,用int array[]表示,并且长度用int length表示。

b.存放在序列的起始位置,指的是待排序的数据的起始位置,那么每次排完一个后,这个起始位置都是变化的,所以这里的一层循环用int position表示,循环初始值为position = 0,循环结束条件为position < length, 循环为position ++。

c.每一次从待排序的数据元素中选出最小(或最大)的一个元素,这里暂且是最小,如何选出呢?就是一一比较待排序数据元素呗,并把最小的记录一下,我们用int min表示,初始值为每次循环的起始值即position,我们把这次循环用j表示,起始值为position,循环结束条件为position < length,循环为j++;循环体就是比较min与j所在元素的大小,并用min记录小的。

d.数据交换问题。

6.实现代码

#include<stdio.h>void selectSort(int *p, int size);void swap(int *a, int *b);void printfArray(int *p, int size);int main() {int a[8] = {49,38,65,97,76,13,27,30};// int a[10] = {2, 1, 3, 4, 5, 6, 7, 8, 9, 10};int size = sizeof(a) / sizeof(a[0]);printfArray(&a[0], size);selectSort(&a[0], size);return 0;}//选择排序(从小到大排列,起始位置为替换位置)void selectSort(int *p, int length) {int min = 0; //min记录每次选择到的最小的元素位置//position代表待排序数据须替换的位置for (int position = 0; position < length; ++position){min = position;//j代表本次寻找数列最大值的游标值for (int j = position; j < length; ++j){//寻找较小的元素位置if (*(p + j) < *(p + min)){min = j;}}//交换待排序位置与较小的元素swap((p + position), (p + min));printfArray(p, length);}}void swap(int *a, int *b) {int c = *a;*a = *b;*b = c;}void printfArray(int *p, int size) {for (int i = 0; i < size; ++i){printf("%d ", *(p + i));}printf("\n");}

7.运行结果


8.时间复杂度

两个循环消耗的时间:

比较时间:T = (n - 1) + (n -2) + ... + 2 + 1 = n*(n - 1) / 2;

交换时间:最好的情况全部元素已经有序,交换次数为0;最差情况,全部元素逆序,就要交换n - 1次。

所以最优的时间复杂度和最差的时间复杂度和平均的时间复杂度都为:o(n^2)

9.空间复杂度

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

10.参考文章

a.排序算法之选择排序及其时间复杂度和空间复杂度(特别推荐)