选择排序(C++,Java,Python实现)
排序算法之选择排序,选择排序,选择排序的基本思想描述为:每一趟在n-i+1(i=1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。具体来说,假设长度为n的数组arr,要按照从小到大排序,那么先从n个数字中找到最小值min1,如果最小值min1的位置不在数组的最左端(也就是min1不等于arr[0]),则将最小值min1和arr[0]交换,接着在剩下的n-1个数字中找到最小值min2,如果最小值min2不等于arr[1],则交换这两个数字,依次类推,直到数组arr有序排列。
算法过程
举个栗子(第一趟的排序过程)
原始序列:3、44、38、5、47、15、36、 26、27、2、46、4、19、50、48
1)在进行选择排序过程中分成有序和无序两个部分,开始都是无序序列
结果:3、44、38、5、47、15、36、 26、27、2、46、4、19、50、48
2)从无序序列中取出最小的元素2,将2同无序序列第一个元素交换,此时产生仅含一个元素的有序序列,无序序列减一
结果:{2、} {44、38、5、47、15、36、 26、27、3、46、4、19、50、48
3)从无序序列中取出最小的元素3,将3同无序序列第一个元素交换,此时产生仅两个元素的有序序列,无序序列减一
结果:{2、3、} {38、5、47、15、36、 26、27、44、46、4、19、50、48}
4)从无序序列中取出最小的元素4,将4同无序序列第一个元素交换,此时产生含三个元素的有序序列,无序序列减一
结果:{2、3、4、} {5、47、15、36、 26、27、44、46、38、19、50、48}
5)从无序序列中取出最小的元素5,5此时是无序序列最小的,不用交换
结果:{2、3、4、5、} {47、15、36、 26、27、44、46、38、19、50、48}
6)从无序序列中取出最小的元素15,将15同无序序列第一个元素交换,此时产生含五个元素的有序序列,无序序列减一
结果:{2、3、4、5、15、} {47、36、 26、27、44、46、38、19、50、48}
7)依次重复上述操作,直到无序序列只有最后一个元素
8)最后一个元素50肯定是最大元素,无序排序直接生产一个有序的序列
结果:{2、3、4、5、19、26、27、36、38、44、46、47、48、50}
最后如果还没有理解这个过程的话,小编放上一个动图,让大家更深入的理解这个过程:
接下来分析完了插入排序的算法,我们就到了分享代码的这个激动人心的时刻了:
插入排序C++实现代码:
#include <iostream>
using namespace std;
#include <vector>
#include <time.h>
vector<int> get_random(int n, int N);
const int MAX_NUM=10000;
int data[100];//定义一个产生数组储存100个随机数
void SelectSort(int n);//选择排序
void output(int n);
void Swap(int i,int j);
int main()
{
srand((unsigned int)time(0));
vector<int> randsample=get_random(100,MAX_NUM);//产生100个0-MAZX_NUM的随机数,每次产生的随机数不一样
int size=randsample.size();
//输出最开始时未排序时的顺序:
cout<<"随机数的顺序:"<<endl;
for(int i=0;i<randsample.size();i++)
{
cout<<randsample[i]<<" ";
}
cout<<endl;
clock_t start,finish;//定义一个测量一段程序运行时间的前后值
double totaltime;//总的运行时间
//测试选择排序
cout<<"执行选择排序后:"<<endl;
for(int i=0;i<randsample.size();i++)
{
data[i]=randsample[i];
}
start=clock();
SelectSort(size);
finish=clock();
output(size);
totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
cout<<"运行时间:"<<totaltime<<endl;
}
//产生随机数的函数
vector<int> get_random(int n, int N)
{
vector<int> vec(N);//N代表初始状态分配的空间大小
vector<int> out_vec;
for(int i=0;i<N;++i)
{
vec[i]=i;
}
for (int i=0;i<n;++i)
{
int rand_value=rand()%N;
out_vec.push_back(vec[rand_value]);
vec[rand_value]=vec[N-1];//将数组vec的元素
N--;
}
return out_vec;
}
//直接选择排序
void SelectSort(int n)
{
int i,j;
int count=0;
int count1=0;
for(i=0;i<n;i++)
{
int k=i;//在data[i]到data[n-1]找最小排序码元素
for(j=i+1;j<n;j++){
if(data[j]<data[k]){
count++;//当前具有最小排序码的元素
k=j;
}
}
if(k!=i)
Swap(i,k);//交换
count1++;
}
cout<<"比较次数: "<<count<<" 移动次数: "<<count1<<endl;
}
void output(int n)
{
for(int i=0;i<n;i++)
{
cout<<data[i]<<" ";
}
cout<<endl;
}
//交换函数
void Swap(int i,int j)
{
int tem;
tem = data[j];
data[j]= data[i];
data[i] = tem;
}
插入排序Java代码实现
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class SelectSort
{
public static void main(String[] args)
{
Object []arr = getRandomNumList(100,0,10000).toArray();
int[] ins = new int [100] ;
System.out.println("排序前:");
for(int i = 0; i < arr.length; i++) {
String s=arr[i].toString();
ins[i]= Integer.parseInt( s );
System.out.println(ins[i]);
}
System.out.println("排序后:");
int[] ins2 = selectsort(ins);
for(int i = 0; i < arr.length; i++) {
System.out.println(ins2[i]);
}
}
public static int[] selectsort(int[] data){
int i,j;
int n = data.length-1;
for(i=0;i<n;i++)
{
int k=i;//在data[i]到data[n-1]找最小排序码元素
for(j=i+1;j<n;j++){
if(data[j]<data[k]){//当前具有最小排序码的元素
k=j;
}
}
if(k!=i)
{
int tem;
tem=data[k];
data[k]=data[i];
data[i]=tem;
}
}
return data;
}
//定义生成随机数并且装入集合容器的方法
//方法的形参列表分别为:生成随机数的个数、生成随机数的值的范围最小值为start(包含start)、值得范围最大值为end(不包含end) 可取值范围可表示为[start,end)
public static List getRandomNumList(int nums,int start,int end){
//1.创建集合容器对象
List list = new ArrayList();
//2.创建Random对象
Random r = new Random();
//循环将得到的随机数进行判断,如果随机数不存在于集合中,则将随机数放入集合中,如果存在,则将随机数丢弃不做操作,进行下一次循环,直到集合长度等于nums
while(list.size() != nums){
int num = r.nextInt(end-start) + start;
if(!list.contains(num)){
list.add(num);
}
}
return list;
}
}
插入排序Python代码实现
import random
def sort(arr):
for j in range(len(arr)-1):
minIndex = j
for i in range(j+1,len(arr),1):
if(arr[i] < arr[minIndex]):
minIndex = i
arr[j],arr[minIndex] = arr[minIndex],arr[j]
def main():
arr =[]
while(len(arr)<100):
x=random.randint(0,10000)
if x not in arr:
arr.append(x)
sort(arr)
print(arr)
if __name__ == "__main__":
main()
算法分析:
直接选择排序的排序码比较次数KCN与元素的初始排列无关。第i趟选择具有最小排序码元素所需的比较次数总是n-i-1次,此处假定整个待排序元素序列有n个元素。因此,总的排序码比较次数为:
KCN=∑i=0n−2(n−i−1)\displaystyle KCN=\sum_{i=0}^{n-2}{(n-i-1)}KCN=i=0∑n−2(n−i−1)=n*(n-1)/2
元素的移动次数与元素序列的初始排列有关。当这组元素的初始状态是按其排序码从小到大有序的时候,元素的移动次数RMN=0,达到最少;而最坏情况是每一趟都要进行交换,总的元素移动次数为RMN=3(n一1)。它对一类重要的元素序列具有较好的效率,这就是元素规模很大,而排序码却比较小的序列。因为对这种的序列进行排序,移动操作所花费的时间要比比较操作的时间大得多,而其他算法移动操作所花费的时间要比比较操作的时间大的多,而其他算法移动操作次数都要比选择排序来得多。直接选择排序是一种不稳定的排序方法。
以上就是本次给大家分享的选择排序的几种实现,如果有什么不足之处欢迎大家指出,留言,互相学习,共同进步。花了几个小时整理,希望得到大家的支持,你的支持就是我前进的动力,下面我会持续更新其他的排序算法,敬请期待!想要了解其他相关内容也可以访问我的个人博客相逢的博客(里面有hexo搭建博客等相关内容)
选择排序(C++,Java,Python实现)的更多相关文章
- sf02_选择排序算法Java Python rust 实现
Java 实现 package common; public class SimpleArithmetic { /** * 选择排序 * 输入整形数组:a[n] [4.5.3.7] * 1. 取数组编 ...
- 选择排序之Java实现
选择排序之Java实现 一.方法一 package cn.com.zfc.lesson21.sort; /** * * @title SelectSort * @describe 选择排序 * @au ...
- 选择排序算法Java与Python实现
Java 实现 package common; public class SimpleArithmetic { /** * 选择排序 * 输入整形数组:a[n] [4.5.3.7] * 1. 取数组编 ...
- Java基础(46):选择排序的Java封装(完整可运行)
1 package lsg.ap.select; import java.util.Random; public class SelectSort { //选择排序 /** *@author: 梁山广 ...
- 排序算法系列:选择排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 从数组头元素索引i开始,寻找后面最小的值(比i位 ...
- 选择排序 思想 JAVA实现
已知一个数组 9.29.95.47.79.37.18.56.96.22 使用选择排序是数组有序 选择排序同样是一个运行时间为O(N²)的排序算法. 算法思想:(以从小到大为例) 9.29.95.47. ...
- 排序算法-选择排序(Java)
package com.rao.linkList; import java.util.Arrays; /** * @author Srao * @className SelectSort * @dat ...
- 经典排序算法之-----选择排序(Java实现)
其他的经典排序算法链接地址:https://blog.csdn.net/weixin_43304253/article/details/121209905 选择排序思想: 思路: 1.从整个数据中挑选 ...
- 简单选择排序(Java)
简单选择排序: 每一趟在整个记录中找到最小的那个作为有序序列的第i个记录. class SelectSort{ public void p(int[] a){ for(int i=0;i<a.l ...
- 选择排序法-java详解案例
/** * 功能:选择排序法 * 思想:第一次从R[0]-R[N-1]中选取最小值,与R[0]交换,第二次从R[1]-R[N-1]中选取最小值,与R[1]交换, * 第三次从R[2]-R[N-1]中 ...
随机推荐
- 阿里云加Picgo或MPic搭建最豪横的图床
阿里云加Picgo或MPic搭建最豪横的图床 首先解释一下什么是图床,图床其实就是提供图片存储的服务器. 对于自建博客来说,由于各种原因的限制(比如穷...)可能无法购买存储空间比较大的VPS. 而对 ...
- STM32时钟配置方法
一.在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. ①HSI是高速内部时钟,RC振荡器,频率为8MHz. ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率 ...
- JAVA和C#中数据库连接池原理与应用
JAVA和C#中数据库连接池原理 在现在的互联网发展中,高并发成为了主流,而最关键的部分就是对数据库操作和访问,在现在的互联网发展中,ORM框架曾出不穷, 比如:.Net-Core的EFCore.Sq ...
- 让 Linux 防火墙新秀 nftables 为你的 VPS 保驾护航
上篇文章 给大家介绍了 nftables 的优点以及基本的使用方法,它的优点在于直接在用户态把网络规则编译成字节码,然后由内核的虚拟机执行,尽管和 iptables 一样都是基于 netfilter, ...
- [Unity] Unity 2019.1.14f 在Terrain中使用Paint Texture的方法
1.点击Terrain中的Paint Texture按钮2.将按钮下面的下拉菜单选择paint texture3.点击Edit Terrain Layers按钮T4.点击弹出菜单的Create Lay ...
- java获取近几天的日期
最近在写接口的时候老遇见从mysql中获取近几天数据的需求,获取日期这块不是很熟,网上看了很多但是代码量都太大,还是问了下别人,写了三行代码就解决了,不多说 贴代码了 下面是我获取近十天,每天的日期: ...
- 给rm命令加保险
众所周知,脑残可以学习,但是手残没法治.相信每一位喜欢用终端操作电脑的同学都曾手误使用 rm 命令把不该删除的文件删了.然而,使用 rm 删除的文件是不会进去回收站的. 所以,最好的方法就是我们自定义 ...
- 推荐 | 7个你最应该知道的机器学习相关github项目
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 磐石 目录: 介绍 Person Blocker(人体自动遮挡) ...
- Xamarin.Forms客户端第一版
Xamarin.Forms客户端第一版 作为TerminalMACS的一个子进程模块,目前完成第一版:读取展示手机基本信息.联系人信息.应用程序本地化. 功能简介 详细功能说明 关于TerminalM ...
- 移动端rem布局实现(vw)
什么是rem?在W3C官网上是这样描述的:“font size of the root element (根元素的字体大小)”.就是说rem是相当于html的,因为网页的默认字体大小是 16px,所以 ...