算法速成(二)七大经典排序之选择排序

今天说的是选择排序,包括“直接选择排序”和“堆排序”。

话说上次“冒泡排序”被快 排虐了,而且“快排”赢得了内库的重用,众兄弟自然眼红,非要找快排一比高下。

这不今天 就来了两兄弟找快排算账。

1.直接选择排序:

先上图:

说实话,直接选择排序最类似于人的本能思想,比如把大小不一的玩具让三岁小毛孩对大小 排个序,

那小孩首先会在这么多玩具中找到最小的放在第一位,然后找到次小的放在第二位, 以此类推。。。。。。

,小 孩子多聪明啊,这么小就知道了直接选择排序。羡慕中........

对的,小孩子给我们上了一课,

第一步: 我们拿80作为参照物(base),在80后面 找到一个最小数20,然后将80跟20交换。

第二步:  第一位数已经是最小数字了,然后我 们推进一步在30后面找一位最小数,发现自己最小,不用交换。

第三步:........

最 后我们排序完毕。大功告成。

既然是来挑战的,那就5局3胜制。

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading;
 using System.Diagnostics;   

 namespace SelectionSort
 {
     public class Program
     {
         static void Main(string[] args)
         {
             //5次比较
             for (int i = 1; i <= 5; i++)
             {
                 List<int> list = new List<int>();   

                 //插入2w个随机数到数组中
                 for (int j = 0; j < 20000; j++)
                 {
                     Thread.Sleep(1);
                     list.Add(new Random((int)DateTime.Now.Ticks).Next(1000, 1000000));
                 }   

                 Console.WriteLine("\n第" + i + "次比较:");   

                 Stopwatch watch = new Stopwatch();   

                 watch.Start();
                 var result = list.OrderBy(single => single).ToList();
                 watch.Stop();   

                 Console.WriteLine("\n快速排序耗费时间:" + watch.ElapsedMilliseconds);
                 Console.WriteLine("输出前十个数:" + string.Join(",", result.Take(10).ToList()));   

                 watch.Start();
                 result = SelectionSort(list);
                 watch.Stop();   

                 Console.WriteLine("\n直接选择排序耗费时间:" + watch.ElapsedMilliseconds);
                 Console.WriteLine("输出前十个数:" + string.Join(",", list.Take(10).ToList()));   

             }
         }   

         //选择排序
         static List<int> SelectionSort(List<int> list)
         {
             //要遍历的次数
             for (int i = 0; i < list.Count - 1; i++)
             {
                 //假设tempIndex的下标的值最小
                 int tempIndex = i;   

                 for (int j = i + 1; j < list.Count; j++)
                 {
                     //如果tempIndex下标的值大于j下标的值,则记录较小值下标j
                     if (list[tempIndex] > list[j])
                         tempIndex = j;
                 }   

                 //最后将假想最小值跟真的最小值进行交换
                 var tempData = list[tempIndex];
                 list[tempIndex] = list[i];
                 list[i] = tempData;
             }
             return list;
         }
     }
 }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索list
, 排序
, system
, 选择
, 排序 list
, 下标
, 直接选择排序
最小
七大排序算法、经典排序算法、java经典排序算法、c语言8大经典排序算法、c语言经典排序算法,以便于您获取更多的相关知识。

时间: 2024-11-03 01:27:19

算法速成(二)七大经典排序之选择排序的相关文章

《算法基础:打开算法之门》一3.2 选择排序

3.2 选择排序 现在让我们将注意力转向排序:重排数组中的所有元素--也称为重排数组--以便每个元素小于或者等于它的后继.我们要看到的第一种排序算法是选择排序,这是我能想到的最简单的算法,在设计一个排序算法时,我最先能想到的就是选择排序,虽然它远远不是最快的算法. 下面我们用依据作者名字对书架上的书排序这个例子来说明选择排序是如何运行的.从左向右查找整个书架,并且找到作者名字最先在字母表中出现的书籍.假定这本排序在字母表中最前的书籍是由Louisa May Alcott所写的(如果书架上包含由该

排序算法之二选择排序-简单选择排序和对堆排序

简单选择排序 (1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换,然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较位置.(2)实例: (3)代码实现: 1234567891011121314151617181920212223242526272829303132 /** * 简单选择排序 */ private static <AnyType extends Comparable<? super AnyType>> voi

排序高级之选择排序_选择排序

选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换.在所有的完全依靠交换去移动元素的排序方

java数组排序示例(冒泡排序、快速排序、希尔排序、选择排序)_java

快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来. 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组. 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序. 复制代码 代码如下: package com.firewolf.sort; public class MySort {  /**  * @param args  */ public

c++ 选择排序-用选择排序的方法对一个有超过100万的数组进行排序

问题描述 用选择排序的方法对一个有超过100万的数组进行排序 我想请教大家,老师让我们用选择排序来对一个有2^20个元素和一个有2^24个元素的数组进行排序并且计算总的操作数.我利用堆分配和教材上的选择排序的代码可以完成对2^16个元素的素组进行排序. 但是对于更大的数组,在编译上没有报错,执行的时候等了很长时间都得不到结果. 我想问一下是内存分配的问题还是有什么别的原因

经典算法(8) MoreWindows白话经典算法之七大排序总结篇

在我的博客对冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆排序这七种 常用的排序方法进行了详细的讲解,并做成了电子书以供大家下载.下载地址为: http://download.csdn.net/detail/morewindows/4443208. 有网友提议到 这本<MoreWindows白话经典算法之七大排序>电子书讲解细致用来平时学习是非常好的,但是页数有22页, 不太合适做面试前的复习资料.因此在这里将这七种常用的排序方法进行下总结,以便大家更好的复习这些 经典

我的Java开发学习之旅------&amp;gt;Java经典排序算法之选择排序

一.算法原理 对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置, 接着第二次比较,前面"后一个元素"现变成了"前一个元素",继续跟他的"后一个元素"进行比较如果后面的元素比 他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了, 然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整 个数组中最小的数了.然后找

内部排序算法:直接选择排序

基本思想 n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: 初始状态:无序区为R[1..n],有序区为空. 第1趟排序:在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1] 交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区. -- 第i趟排序:第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R[i..n](1≤i≤n-1). 该趟排序从当前无序区中选出关键字最小的记录R[k],

Java实现选择排序算法的实例教程_java

选择排序概念 选择排序也是一种交换排序算法,和冒泡排序有一定的相似度,因此个人认为选择排序可以视为冒泡排序的一种改进算法.它的思路是这样的: 设现在要给数组arr[]排序,它有n个元素. 1对第一个元素(Java中,下标为0)和第二个元素进行比较,如果前者大于后者,那么它一定不是最小的,但是我们并不像冒泡排序一样急着交换.我们可以设置一个临时变量a,存储这个目前最小的元素的下标.然后我们把这个目前最小的元素继续和第三个元素做比较,如果它仍不是最小的,那么,我们再修改a的值.如此直到和最后一个元素