亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 邏輯算法 > 正文

算法系列15天速成 第二天 七大經(jīng)典排序【中】

2024-09-08 23:18:38
字體:
供稿:網(wǎng)友

首先感謝朋友們對第一篇文章的鼎力支持,感動中....... 

 

今天說的是選擇排序,包括“直接選擇排序”和“堆排序”。

話說上次“冒泡排序”被快排虐了,而且“快排”贏得了內(nèi)庫的重用,眾兄弟自然眼紅,非要找快排一比高下。

這不今天就來了兩兄弟找快排算賬。

1.直接選擇排序: 

先上圖:

說實話,直接選擇排序最類似于人的本能思想,比如把大小不一的玩具讓三歲小毛孩對大小排個序,

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

,小孩子多聰明啊,這么小就知道了直接選擇排序。羨慕中........

對的,小孩子給我們上了一課,

第一步: 我們拿80作為參照物(base),在80后面找到一個最小數(shù)20,然后將80跟20交換。

第二步:  第一位數(shù)已經(jīng)是最小數(shù)字了,然后我們推進一步在30后面找一位最小數(shù),發(fā)現(xiàn)自己最小,不用交換。

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

最后我們排序完畢。大功告成。

既然是來挑戰(zhàn)的,那就5局3勝制。

復(fù)制代碼 代碼如下:

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個隨機數(shù)到數(shù)組中
                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("輸出前十個數(shù):" + string.Join(",", result.Take(10).ToList()));

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

                Console.WriteLine("/n直接選擇排序耗費時間:" + watch.ElapsedMilliseconds);
                Console.WriteLine("輸出前十個數(shù):" + string.Join(",", list.Take(10).ToList()));

            }
        }

        //選擇排序
        static List<int> SelectionSort(List<int> list)
        {
            //要遍歷的次數(shù)
            for (int i = 0; i < list.Count - 1; i++)
            {
                //假設(shè)tempIndex的下標(biāo)的值最小
                int tempIndex = i;

                for (int j = i + 1; j < list.Count; j++)
                {
                    //如果tempIndex下標(biāo)的值大于j下標(biāo)的值,則記錄較小值下標(biāo)j
                    if (list[tempIndex] > list[j])
                        tempIndex = j;
                }

                //最后將假想最小值跟真的最小值進行交換
                var tempData = list[tempIndex];
                list[tempIndex] = list[i];
                list[i] = tempData;
            }
            return list;
        }
    }
}

比賽結(jié)果公布:

堆排序:

要知道堆排序,首先要了解一下二叉樹的模型。

下圖就是一顆二叉樹,具體的情況我后續(xù)會分享的。

那么堆排序中有兩種情況(看上圖理解):

    大根堆:  就是說父節(jié)點要比左右孩子都要大。

    小根堆:  就是說父節(jié)點要比左右孩子都要小。

 

那么要實現(xiàn)堆排序,必須要做兩件事情:

   第一:構(gòu)建大根堆。

           首先上圖:

           

首先這是一個無序的堆,那么我們怎樣才能構(gòu)建大根堆呢?

     第一步: 首先我們發(fā)現(xiàn),這個堆中有2個父節(jié)點(2,,3);

     第二步: 比較2這個父節(jié)點的兩個孩子(4,5),發(fā)現(xiàn)5大。

     第三步: 然后將較大的右孩子(5)跟父節(jié)點(2)進行交換,至此3的左孩子堆構(gòu)建完畢,

                 如圖:

                         

     第四步: 比較第二個父節(jié)點(3)下面的左右孩子(5,1),發(fā)現(xiàn)左孩子5大。

     第五步: 然后父節(jié)點(3)與左孩子(5)進行交換,注意,交換后,堆可能會遭到破壞,

                 必須按照以上的步驟一,步驟二,步驟三進行重新構(gòu)造堆。

           

最后構(gòu)造的堆如下:

                 

 

   第二:輸出大根堆。

             至此,我們把大根堆構(gòu)造出來了,那怎么輸出呢?我們做大根堆的目的就是要找出最大值,

         那么我們將堆頂(5)與堆尾(2)進行交換,然后將(5)剔除根堆,由于堆頂現(xiàn)在是(2),

         所以破壞了根堆,必須重新構(gòu)造,構(gòu)造完之后又會出現(xiàn)最大值,再次交換和剔除,最后也就是俺們

         要的效果了,

 

 

發(fā)現(xiàn)自己兄弟被別人狂毆,,堆排序再也坐不住了,決定要和快排干一場。

同樣,快排也不甘示弱,誰怕誰?

復(fù)制代碼 代碼如下:

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

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

                //插入2w個數(shù)字
                for (int i = 0; i < 20000; i++)
                {
                    Thread.Sleep(1);
                    list.Add(new Random((int)DateTime.Now.Ticks).Next(1000, 100000));
                }

                Console.WriteLine("/n第" + j + "次比較:");

                Stopwatch watch = new Stopwatch();
                watch.Start();
                var result = list.OrderBy(single => single).ToList();
                watch.Stop();
                Console.WriteLine("/n快速排序耗費時間:" + watch.ElapsedMilliseconds);
                Console.WriteLine("輸出前十個數(shù)" + string.Join(",", result.Take(10).ToList()));

                watch = new Stopwatch();
                watch.Start();
                HeapSort(list);
                watch.Stop();
                Console.WriteLine("/n堆排序耗費時間:" + watch.ElapsedMilliseconds);
                Console.WriteLine("輸出前十個數(shù)" + string.Join(",", list.Take(10).ToList()));
            }

        }

        ///<summary>
/// 構(gòu)建堆
///</summary>
///<param name="list">待排序的集合</param>
///<param name="parent">父節(jié)點</param>
///<param name="length">輸出根堆時剔除最大值使用</param>
        static void HeapAdjust(List<int> list, int parent, int length)
        {
            //temp保存當(dāng)前父節(jié)點
            int temp = list[parent];

            //得到左孩子(這可是二叉樹的定義,大家看圖也可知道)
            int child = 2 * parent + 1;

            while (child < length)
            {
                //如果parent有右孩子,則要判斷左孩子是否小于右孩子
                if (child + 1 < length && list[child] < list[child + 1])
                    child++;

                //父親節(jié)點大于子節(jié)點,就不用做交換
                if (temp >= list[child])
                    break;

                //將較大子節(jié)點的值賦給父親節(jié)點
                list[parent] = list[child];

                //然后將子節(jié)點做為父親節(jié)點,已防止是否破壞根堆時重新構(gòu)造
                parent = child;

                //找到該父親節(jié)點較小的左孩子節(jié)點
                child = 2 * parent + 1;
            }
            //最后將temp值賦給較大的子節(jié)點,以形成兩值交換
            list[parent] = temp;
        }

        ///<summary>
/// 堆排序
///</summary>
///<param name="list"></param>
        public static void HeapSort(List<int> list)
        {
            //list.Count/2-1:就是堆中父節(jié)點的個數(shù)
            for (int i = list.Count / 2 - 1; i >= 0; i--)
            {
                HeapAdjust(list, i, list.Count);
            }

            //最后輸出堆元素
            for (int i = list.Count - 1; i > 0; i--)
            {
                //堆頂與當(dāng)前堆的第i個元素進行值對調(diào)
                int temp = list[0];
                list[0] = list[i];
                list[i] = temp;

                //因為兩值交換,可能破壞根堆,所以必須重新構(gòu)造
                HeapAdjust(list, 0, i);
            }
        }
    }
}

結(jié)果公布:

堆排序此時心里很尷尬,雙雙被KO,心里想,一定要撈回面子,一定要贏,

于是堆排序提出了求“前K大問題”。(就是在海量數(shù)據(jù)中找出前幾大的數(shù)據(jù)),

快排一口答應(yīng),小意思,沒問題。

雙方商定,在2w隨機數(shù)中找出前10大的數(shù):

復(fù)制代碼 代碼如下:

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

namespace QuickSort
{
    public class Program
    {
        static void Main(string[] args)
        {
            //5此比較
            for (int j = 1; j <= 5; j++)
            {
                List<int> list = new List<int>();

                for (int i = 0; i < 20000; i++)
                {
                    Thread.Sleep(1);
                    list.Add(new Random((int)DateTime.Now.Ticks).Next(1000, 100000));
                }

                Console.WriteLine("/n第" + j + "次比較:");

                Stopwatch watch = new Stopwatch();
                watch.Start();
                var result = list.OrderByDescending(single => single).Take(10).ToList();
                watch.Stop();
                Console.WriteLine("/n快速排序求前K大耗費時間:" + watch.ElapsedMilliseconds);
                Console.WriteLine("輸出前十個數(shù):" + string.Join(",", result.Take(10).ToList()));

                watch = new Stopwatch();
                watch.Start();
                result = HeapSort(list, 10);
                watch.Stop();
                Console.WriteLine("/n堆排序求前K大耗費時間:" + watch.ElapsedMilliseconds);
                Console.WriteLine("輸出前十個數(shù):" + string.Join(",", list.Take(10).ToList()));
            }

        }

        ///<summary>
/// 構(gòu)建堆
///</summary>
///<param name="list">待排序的集合</param>
///<param name="parent">父節(jié)點</param>
///<param name="length">輸出根堆時剔除最大值使用</param>
        static void HeapAdjust(List<int> list, int parent, int length)
        {
            //temp保存當(dāng)前父節(jié)點
            int temp = list[parent];

            //得到左孩子(這可是二叉樹的定義哇)
            int child = 2 * parent + 1;

            while (child < length)
            {
                //如果parent有右孩子,則要判斷左孩子是否小于右孩子
                if (child + 1 < length && list[child] < list[child + 1])
                    child++;

                //父節(jié)點大于子節(jié)點,不用做交換
                if (temp >= list[child])
                    break;

                //將較大子節(jié)點的值賦給父親節(jié)點
                list[parent] = list[child];

                //然后將子節(jié)點做為父親節(jié)點,已防止是否破壞根堆時重新構(gòu)造
                parent = child;

                //找到該父節(jié)點左孩子節(jié)點
                child = 2 * parent + 1;
            }
            //最后將temp值賦給較大的子節(jié)點,以形成兩值交換
            list[parent] = temp;
        }

        ///<summary>
/// 堆排序
///</summary>
///<param name="list">待排序的集合</param>
///<param name="top">前K大</param>
///<returns></returns>
        public static List<int> HeapSort(List<int> list, int top)
        {
            List<int> topNode = new List<int>();

            //list.Count/2-1:就是堆中非葉子節(jié)點的個數(shù)
            for (int i = list.Count / 2 - 1; i >= 0; i--)
            {
                HeapAdjust(list, i, list.Count);
            }

            //最后輸出堆元素(求前K大)
            for (int i = list.Count - 1; i >= list.Count - top; i--)
            {
                //堆頂與當(dāng)前堆的第i個元素進行值對調(diào)
                int temp = list[0];
                list[0] = list[i];
                list[i] = temp;

                //最大值加入集合
                topNode.Add(temp);

                //因為順序被打亂,必須重新構(gòu)造堆
                HeapAdjust(list, 0, i);
            }
            return topNode;
        }
    }
}

求前K大的輸出結(jié)果:

最后堆排序趕緊拉著直接選擇排序一路小跑了,因為求前K大問題已經(jīng)不是他原本來的目的。

ps: 直接選擇排序的時間復(fù)雜度為:O(n^2)

       堆排序的時間復(fù)雜度:O(NlogN)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
久久香蕉国产线看观看网| 青青草国产精品一区二区| 欧美日韩精品不卡| 婷婷在线精品视频| 国产成人拍精品视频午夜网站| 亚洲成人手机在线| 亚洲午夜性刺激影院| a级片一区二区| 精品制服美女久久| 日本中文字幕精品| 国产精选一区二区| 亚洲一区三区视频在线观看| 国产精品视频| 色噜噜色狠狠狠狠狠综合色一| 四虎精品成人免费观看| 日韩国产第一页| 成人在线免费电影网站| 国产69精品久久久久久| 触手亚洲一区二区三区| 一本久道久久综合狠狠爱亚洲精品| 韩国三级与黑人| 伊人色综合久久天天| 新天天拍日日拍狠狠拍| 久久6免费视频| 午夜一区二区三区在线观看| 天堂视频福利| 国产奶头好大揉着好爽视频| 久久97久久97精品免视看| av中文字幕在线免费观看| 亚洲美女福利视频网站| 亚洲综合av一区| 国产精品一区免费视频| 久久久久久久久岛国免费| 久久婷婷综合色| 国精品一区二区| 欧美亚日韩国产aⅴ精品中极品| 中文在线播放| 国产综合中文字幕| 久久蜜桃精品| 偷拍日韩校园综合在线| 激情综合五月婷婷| 成年人一级黄色片| 亚洲黄色片网站| 九七电影院97理论片久久tvb| 亚洲一区二区91| 国产成人精品一区二区在线小狼| 蜜臀久久99精品久久久无需会员| 亚洲人亚洲人成电影网站色| 欧日韩在线视频| 日韩在线观看免费高清| 久久综合色一综合色88| 亚洲另类欧美日韩| 日韩欧美视频免费观看| 久久久久国产精品免费免费搜索| 中文一区一区三区免费在线观看| 97国产精品videossex| 97精品视频| 激情图片qvod| 国产精品美女午夜av| 欧洲vs亚洲vs国产| 不卡av免费在线| 欧美激情视频一区二区三区在线播放| 久久看片网站| 精品电影一区| 91中文字幕在线播放| 日本三级日本三级日本三级极| av影片在线播放| 国产大学生视频| 丰满岳乱妇dvd日本| 99精品久久免费看蜜臀剧情介绍| 日韩欧美电影| 美女扒开腿让男人桶爽久久软| 一区二区在线| 成人亚洲综合| 中文字幕精品亚洲| 精品一区二区三区毛片| 久久久久国产一区| 91免费观看网站| 成人3d动漫网站| 五十路在线视频| 青娱乐av在线| 欧美一区二区观看视频| 国产在线一区二区三区播放| 国产欧美日韩一区二区三区| 最新成人av网站| 成人同人动漫免费观看| 色老汉一区二区三区| 久久久美女视频| 久久人妻少妇嫩草av无码专区| 激情综合网天天干| 亚洲激情专区| 91精品久久久久久| 一区二区视频免费观看| 久久天天躁夜夜躁狠狠躁2022| 欧美久久一二三四区| 日韩av第一页| 在线成人高清不卡| 自拍偷拍亚洲精品| 欧美jizzhd欧美| 日韩一区二区视频在线观看| 欧美精品一区二区三| 欧美日韩一区综合| 亚洲成人影院麻豆| 欧美精品一区二区三区久久久| 久久久久久91| 性欧美videos白嫩| 日本一区免费网站| 日韩人妻无码一区二区三区| 久久福利在线| 日本成人福利| 丝袜 亚洲 另类 欧美 重口| www.尤物.com| 欧性猛交ⅹxxx乱大交| 国产精品一区二区亚洲| 91麻豆精品久久毛片一级| jlzzjlzz亚洲女人18| 亚洲国产日韩成人综合天堂| 日韩免费视频一区二区视频在线观看| 国产精品一区二区无码对白| 亚洲精选av在线| 色综合视频网站| 综合天天久久| 美女又爽又黄免费| 神马午夜在线观看| 在线观看免费播放网址成人| 色8久久精品久久久久久蜜| 欧美猛男做受videos| 一级黄色a毛片| 精品a在线观看| 国产精品96久久久久久又黄又硬| 亚洲人体大胆视频| 国产精品污www一区二区三区| 久久久久久国产精品久久| 777av视频| 亚洲国产电影在线观看| 黄页免费在线观看视频| jizz国产在线观看| 亚洲一区欧美一区| 欧美精品观看| 国产一区影院| 青青草免费观看免费视频在线| 欧美日韩一区精品| 国产精品一区二区男女羞羞无遮挡| 日本成人在线免费| 国产精品综合久久久久| 欧美在线精品免播放器视频| 国产精品成人免费一区久久羞羞| 欧美午夜精彩| 成人短片线上看| аⅴ成人天堂中文在线| 久久精品男人天堂| 亚洲丝袜自拍清纯另类| 国产精品视频一区二区三区,| 国产精品白丝av| 自由色视频.| 不卡毛片在线看| 色综合咪咪久久网| 亚洲在线色站| www日韩精品| 国产污污在线观看| 欧美极品欧美精品欧美视频| 高清不卡一区| 69精品丰满人妻无码视频a片| 欧美videossex| 一级做a免费视频| 天美传媒免费在线观看| 先锋影音av网站| 天天操天天擦| 日本欧美电影在线观看| xxxxxwwww免费视频| 寂寞少妇一区二区三区| 久久草视频在线看| yjizz国产| 国产精品video| 黄色片在线观看网站| 日本精品免费视频| 风间由美性色一区二区三区| 在线影院福利| 一二三四视频在线社区中文字幕2| 91麻豆免费在线视频| 毛片毛片毛片毛片| 久久99国产精品久久久久久久久| 欧美一区午夜精品| 裸体素人女欧美日韩| 日韩精品视频观看| 国产裸体永久免费无遮挡| 久久亚洲免费视频| 欧美风情在线视频| 337p亚洲精品色噜噜| 天天操夜夜草| 九色精品免费永久在线| 一级毛片视频在线| www.91视频.com| 精品少妇一区二区| 日本成人三级电影网站| 小早川怜子影音先锋在线观看| 一区二区三区在线免费| 99久热re在线精品996热视频| 日韩在线观看视频网站| 91精品久久久久久久久不口人| 亚洲一级片在线看| t66y永久入口地址| 青青青在线观看视频| 国产精品青草久久久久福利99| 美国十次综合久久| 亚洲精品久久久久| 亚洲激情在线播放| 日本一区二区三区国色天香| 久久久久久久极品| 日韩成人高清| 国产精品黄色片| 国产欧美成人xxx视频| 伊人精品视频在线观看| 日韩久久精品成人| 二个人看的毛片| 欧美精品手机在线| 中文字幕av在线一区二区三区| 黄色在线免费看| 精品一区二区三区自拍图片区| 国产农村av| 国产不卡精品一区二区三区| 国产后进白嫩翘臀在线观看视频| 亚洲xxx自由成熟| 亚洲无限乱码一二三四麻| 神马影院一区二区三区| 国产视频久久久久| 亚洲成色www8888| 91精品久久久久久久91蜜桃| 最新亚洲伊人网| 亚洲国产美女精品久久久久∴| 久久久久久人妻一区二区三区| 久久综合成人精品亚洲另类欧美| 日韩手机在线| 黄网视频在线观看| 亚洲福利视频网站| 日韩电影在线观看电影| 欧美日韩国产乱码电影| 亚洲av毛片成人精品| 992tv成人免费影院| 欧美人与动牲性行为| 红桃视频 国产| 久久网站热最新地址| 日韩欧美综合一区| 在线观看污污视频| 亚洲精品在线播放| 欧美日韩精品一本二本三本| 爽爽窝窝午夜精品一区二区| 欧美另类一区二区三区| 丝袜足控免费网站xx网站| 欧美激情综合色综合啪啪| 日韩精品视频免费专区在线播放| 一区二区三区日韩视频| 色乱码一区二区三区88| 极品颜值美女露脸啪啪| 亚洲不卡免费视频| 欧美精品首页| 91精品啪在线观看国产18| 亚洲成人第一网站| 亚洲第一天堂久久| 亚洲乱码一区二区三区在线观看| 午夜免费啪视频观看视频| a级片国产精品自在拍在线播放| 国产黄色av网站| 国产欧美 在线欧美| 午夜精品久久久久久久91蜜桃| 亚洲va久久久噜噜噜久久| 在线色视频网| 国产精品99久久免费黑人人妻| 一区二区三区无毛| 久久久精品久久久久特色影视| 蜜桃久久久久久久| 精品国产乱码一区二区三区| 亚洲ⅴ国产v天堂a无码二区| 尤物网站在线观看| 国产精品入口夜色视频大尺度| 亚洲美女一区二区三区| 欧美成人做性视频在线播放| 男女激情视频网站| 免费欧美一级片| 国产一级性生活| 天天插天天操天天干| 国产欧美一区二区三区在线看| 91精品国产91久久久久久黑人| 国产一区二区精品免费| 91小视频在线播放| 欧美极品美女视频| 天天综合国产| 欧美三级在线看| 日韩成人综合网站| 国产日韩换脸av一区在线观看| 欧美日韩成人免费观看| 日日天天久久| 精精国产xxx在线视频app| 蜜臀在线免费观看| 欧美熟妇精品黑人巨大一二三区| 久久久精品一品道一区| 亚洲狼人精品一区二区三区| 成人性生交大片免费看中文视频| 亚洲欧美日韩国产成人综合一二三区| 青青草视频一区| 中文字幕另类日韩欧美亚洲嫩草| 欧美精品一区二区三区在线看午夜| 亚洲欧美视频一区二区三区| 在线观看av的网址| 欧美日韩激情视频在线观看| 亚洲在线免费观看视频| 新版中文在线官网| 国产精品 欧美激情| 日韩精品视频免费播放| 久久九九久精品国产免费直播| 国产在线播放91| 男女啪啪a级毛片| 中文字幕一区二区三区最新| 国产探花视频在线| 最近中文字幕在线视频| 91精品国产乱码久久久久久| 欧美一级淫片aaaaaa| 丝袜美腿亚洲一区| 91麻豆精品视频| 亚洲小视频在线观看| 日本中文字幕视频一区| 天天操,天天操| 美国三级日本三级久久99| 东方aⅴ免费观看久久av| 日韩精品在在线一区二区中文| 国产又黄又大久久| 日韩一区二区三免费高清在线观看| 成人免费视频久久|