简单选择排序

一、算法描述

假设序列中有N个元素:

第1趟找到第1到N个元素之间最小的一个,与第1个元素进行交换

第2趟找到第2到N个元素之间最小的一个,与第2个元素进行交换

第3趟找到第3到N个元素之间最小的一个,与第3个元素进行交换

第m趟找到第m到N个元素之间最小的一个,与第m个元素进行交换

第N趟(最后一趟)找到第N到N个元素之间最小的一个(即最后一个元素),与第N个元素进行交换(无需交换)

即每次找到剩下无序序列中元素中最小的,与无序序列最前面的元素交换,逐渐形成第一个元素有序,第一到二个元素有序,第一到三个元素有序。。。。。。。全部元素有序

二、算法分析

有两层循环,共需作 n(n-1)/2 次比较,固时间复杂度为O(n^2)

且是不稳定的排序算法,空间复杂度为O(1)

无论序列怎样,都需完成N趟排序,所以最好、最坏和平均情况的执行时间是相同的

三、算法实现代码

定义顺序表代码:

typedef struct list {
int Size;//大小
int Elements[MaxSize];//用数组存放
}List;//定义顺序表

定义简单选择函数代码:

void Jiandanxuanze(List*lst)
{
int small;//存放最小元素下标
int i, j, temp;
for (i = 0; i<lst->Size - 1; i++)//最后一次无需执行,共执行Size-1次
{
small = i;
for (j = i + 1; j<lst->Size; j++)
{
if (lst->Elements[j]<lst->Elements[small])
small = j;//找到最小的元素的下标存在small,然后与i进行交换
}
temp = lst->Elements[i];
lst->Elements[i] = lst->Elements[small];
lst->Elements[small] = temp;//把最小的元素与最前的即i进行交换
}
}

四、实例测试代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MaxSize 99 typedef struct list {
int Size;//大小
int Elements[MaxSize];//用数组存放
}List;//定义顺序表 void Jiandanxuanze(List*lst);//函数声明 int main(void) {
List a;
int i;
srand((unsigned)time(NULL)); //随机数种子
a.Size = 10;//定义大小为10 for ( i = 0; i<10;i++)
{
a.Elements[i] = rand() % 10;//初始化顺序表
} printf("原表为:");
for (i = 0; i < 10;i++)
{
printf("%d ", a.Elements[i]);
}
printf("\n"); Jiandanxuanze(&a);//调用简单选择函数,修改值需传入地址 printf("简单选择排序后为:");
for (i = 0; i < 10; i++)
{
printf("%d ", a.Elements[i]);
}
getchar();
return 0;
} void Jiandanxuanze(List*lst)
{
int small;//存放最小元素下标
int i, j, temp;
for (i = 0; i<lst->Size - 1; i++)
{
small = i;
for (j = i + 1; j<lst->Size; j++)
{
if (lst->Elements[j]<lst->Elements[small])
small = j;//找到最小的元素的下标存在small
} temp = lst->Elements[i];
lst->Elements[i] = lst->Elements[small];
lst->Elements[small] = temp;//把最小的元素与最前的进行交换
}
}

【算法】简单选择排序 O(n^2) 不稳定的 C语言的更多相关文章

  1. 八大排序算法~简单选择排序【记录下标k变量的作用】

    八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...

  2. 排序系列 之 简单选择排序及其改进算法 —— Java实现

    简单选择排序算法: 基本思想: 在待排序数据中,选出最小的一个数与第一个位置的数交换:然后在剩下的数中选出最小的数与第二个数交换:依次类推,直至循环到只剩下两个数进行比较为止. 实例: 0.初始状态 ...

  3. 常见排序算法总结:插入排序,希尔排序,冒泡排序,快速排序,简单选择排序以及java实现

    今天来总结一下常用的内部排序算法.内部排序算法们需要掌握的知识点大概有:算法的原理,算法的编码实现,算法的时空复杂度的计算和记忆,何时出现最差时间复杂度,以及是否稳定,何时不稳定. 首先来总结下常用内 ...

  4. 八大排序算法之三选择排序—简单选择排序(Simple Selection Sort)

    基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...

  5. 简单选择排序算法的C++实现

    简单选择排序采用最简单的选择方法,即在剩余序列中选出最小(或最大)的关键字,和剩余序列的第一个关键字交换位置,依次选择下去,直至使整个序列有序. 算法中两层循环的执行次数和初始序列没有关系,第二层循环 ...

  6. JAVA简单选择排序算法原理及实现

    简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...

  7. [Swift]八大排序算法(三):选择排序 和 简单选择排序

    排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...

  8. 冒泡排序算法和简单选择排序算法的js实现

    之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(d ...

  9. Java排序算法(二):简单选择排序

    [基本思想] 在要排序的一组数中.选出最小的一个数与第一个位置的数交换:然后在剩下的数中再找出最小的与第二个位置的数交换,如此循环至倒数第二个数和最后一个数比較为止. 算法关键:找到最小的那个数.并用 ...

随机推荐

  1. php类获取静态变量值以及调用

    <?php class Test{ public static $static_var = 20; } echo Test::$static_var;exit;

  2. HDU2699+Easy

    简单题. /* */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<alg ...

  3. C# 之 System.Object

    System.Object     C#中全部的类都直接或间接继承自System.Object类,这使得C#中的类得以单根继承.假设我们没有明白指定继承类,编译器缺省觉得该类继承自System.Obj ...

  4. activeMQ数据消耗,但在该站的中间,但是没有理由删除数据

    connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); 第一参数改变时TRUE后,消费数据将出现在MQ中间站没有记录删除. ...

  5. systrace跟踪 Android性能优化

    http://blog.csdn.net/oujunli/article/details/8138172 http://blog.csdn.net/oujunli/article/details/50 ...

  6. Hadoop作业调度器

    随着 MapReduce 的流行,其开源实现 Hadoop 也变得越来越受推崇.在 Hadoop 系统中,有一个组件非常重要,那就是调度器.调度器是一个可插拔的模块,用户可以根据自己的实际应用要求设计 ...

  7. spring-data-redis工程

    官方文档:http://docs.spring.io/spring-data/data-redis/docs/current/reference/html/redis.html The Spring ...

  8. heap堆内存不足

    配置jvm内存,加个启动参数 -Xms512m -Xmx512m -XX:PermSize=128m  -XX:MaxPermSize=256m   start 下面是这个: -Dcatalina.h ...

  9. Java基础知识强化之集合框架笔记22:List集合的三个子类的特点(面试题)

    1. List:(面试题List的子类特点)(1)ArrayList: 底层数据结构是数组,查询快,增删慢. 线程不安全,效率高.(2)Vector: 底层数据结构是数组,查询快,增删慢. 线程安全, ...

  10. NUll在oracle与sqlserver中使用相同与区别

    最近在使用Oracle进行开发,遇到很多与以前使用sqlserver的不同语法.今天遇到null在两种数据库上面操作上的差别,在此记录两种数据库上的差异. null 与字符串相加 1.在oracle中 ...