【算法】简单选择排序 O(n^2) 不稳定的 C语言
简单选择排序
一、算法描述
假设序列中有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语言的更多相关文章
- 八大排序算法~简单选择排序【记录下标k变量的作用】
八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...
- 排序系列 之 简单选择排序及其改进算法 —— Java实现
简单选择排序算法: 基本思想: 在待排序数据中,选出最小的一个数与第一个位置的数交换:然后在剩下的数中选出最小的数与第二个数交换:依次类推,直至循环到只剩下两个数进行比较为止. 实例: 0.初始状态 ...
- 常见排序算法总结:插入排序,希尔排序,冒泡排序,快速排序,简单选择排序以及java实现
今天来总结一下常用的内部排序算法.内部排序算法们需要掌握的知识点大概有:算法的原理,算法的编码实现,算法的时空复杂度的计算和记忆,何时出现最差时间复杂度,以及是否稳定,何时不稳定. 首先来总结下常用内 ...
- 八大排序算法之三选择排序—简单选择排序(Simple Selection Sort)
基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...
- 简单选择排序算法的C++实现
简单选择排序采用最简单的选择方法,即在剩余序列中选出最小(或最大)的关键字,和剩余序列的第一个关键字交换位置,依次选择下去,直至使整个序列有序. 算法中两层循环的执行次数和初始序列没有关系,第二层循环 ...
- JAVA简单选择排序算法原理及实现
简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...
- [Swift]八大排序算法(三):选择排序 和 简单选择排序
排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...
- 冒泡排序算法和简单选择排序算法的js实现
之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(d ...
- Java排序算法(二):简单选择排序
[基本思想] 在要排序的一组数中.选出最小的一个数与第一个位置的数交换:然后在剩下的数中再找出最小的与第二个位置的数交换,如此循环至倒数第二个数和最后一个数比較为止. 算法关键:找到最小的那个数.并用 ...
随机推荐
- BZOJ 1835: [ZJOI2010]base 基站选址 [序列DP 线段树]
1835: [ZJOI2010]base 基站选址 题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立 ...
- Linux下部署LVS(DR)+keepalived+Nginx负载均衡
架构部署 LVS/keepalived(master):192.168.21.3 LVS/keepalived(Slave):192.168.21.6 Nginx1:192.168.21.4 N ...
- request和response的中文乱码问题
request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码: response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码: ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(5)-EF增删改查by糟糕的代码
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(5)-EF增删改查by糟糕的代码 上一讲我们创建了一系列的解决方案,我们通过一个例子来看看层与层之间的关系 ...
- struts2 json 定义全局Date格式
使用struts2的json插件时,自己定义日期格式经常使用的方式是在get属性上加入@JSON注解,这个对于少量Date属性还能够,可是假设date字段多了,总不可能去给每一个date get方法加 ...
- IDL计算儒略日
遥感数据还有一些文章中使用数据的时候,经常使用儒略日(Julian day),即计算该天是一年中的第几天.正好有时间,就用IDL写了段儿小代码,方便使用. ;+ ; :Author: caoz ...
- 惠普 hpssacli 工具使用
查看raid卡信息(包括控制器状态.Cache状态.电池状态) # hpssacli ctrl all show status 查看raid详细信息 # hpssacli ctrl slot=0 sh ...
- JAVA学习笔记--二
一.抽象类: 访问修饰符 abstract class 类名{ } 抽象类和普通类的区别: 1. 抽象类不能被实例化 2. 抽象类一般含有抽象方法 抽象方法:在抽象类中只有方法签名(方法声明),没有方 ...
- weex APIs
1.通过这个$vm()上下文访问这些api在脚本的方法 <script> module.exports = { methods: { somemethod: function() { th ...
- EF Lambda 多表查询
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mv ...