简单选择排序

一、算法描述

假设序列中有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. Magic of David Copperfield II(奇偶性)

    题目大意:这是一个魔术游戏,首先把你的手指放在一个左上角的格子里面,然后魔术师说你可以移动K1步,移动完之后,他会删除一些方格,并且说,你肯定不在这里,删除的方格不可以再去了,然后让你再走K2步,继续 ...

  2. MyEclipe10中集成Tomcat7

    1.MyEclipse|Servers|Tomcat|Tomcat 7.x 2.Enable 3.Browse:D:\Tomcat 7.0 4.JDK:下拉选择JDK7.0,注意:千万不能在此处右键A ...

  3. C# 实现关闭按钮隐藏窗体而不退出

    private void OpenNewMxdFrm_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; thi ...

  4. [kuangbin带你飞]专题十 匹配问题 二分图多重匹配

    二分图的多重匹配问题不同于普通的最大匹配中的"每个点只能有最多一条边" 而是"每个点连接的边数不超过自己的限定数量" 最大匹配所解决的问题一般是"每个 ...

  5. 3proxy 二级代理配置样例

    适应情况: 有时,我们的机器HOST-A只能通过代理服务器HOST-B才可以访问internet, 而与我们相连的机器HOST-C也需要访问internet, 但是HOST-C却不能直接访问HOST- ...

  6. dom4j的基本操作

    /** * 建立一个XML文档,文档名由输入属性决定 * @param filename 需建立的文件名 * @return 返回操作结果, 0表失败, 1表成功 */ import java.io. ...

  7. 解决github提交commit,contributions不统计显示绿色的问题

    最近使用GitHub Desktop时,发现自己好多次的commits都没有被记录在Contributions中,但是点开项目详情里面可以看到自己的commit确实上传成功了,所以就忧伤了,为什么没有 ...

  8. 11.3 afternoon

    迭代40 #include<cstdio> #include<cstring> using namespace std; int n,sum,falg; ],c[]; void ...

  9. java simple check whether a file or directory.

    Ref:  check whether a file or directory First, make sure the path exists by using: new File(path).ex ...

  10. js正则实现用户输入银行卡号的控制及格式化

    //js正则实现用户输入银行卡号的控制及格式化 <script language="javascript" type="text/javascript"& ...