国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

【算法】計(jì)數(shù)排序 + 各個(gè)排序算法的穩(wěn)定性

不知名網(wǎng)友 / 2120人閱讀

摘要:將大的先放在后面,再下一次可以把相同大的放在上一次的之前,順序改變。

之前介紹的排序算法:


計(jì)數(shù)排序

計(jì)數(shù)排序是一個(gè)非基于比較的排序算法,該算法于1954年由Harold H. Seward提出

它的優(yōu)勢(shì)在于在對(duì)一定范圍內(nèi)的整數(shù)排序時(shí),它的復(fù)雜度為Ο(n+k)(其中k是整數(shù)的范圍),快于任何比較排序算法

當(dāng)然這是一種犧牲空間換取時(shí)間的做法,而且當(dāng)O(k)>O(n*log(n))的時(shí)候其效率反而不如基于比較的排序(基于比較的排序的時(shí)間復(fù)雜度在理論上的下限是O(n*log(n)), 如歸并排序,堆排序)

  • 時(shí)間復(fù)雜度:O(Max(N, Range))
  • 空間復(fù)雜度:O(range)
  • 適合范圍比較集中的整數(shù)數(shù)組
  • 范圍較大,或者是浮點(diǎn)數(shù)等等都不適合排序了

一、算法思路圖解

1. 計(jì)數(shù)

基本思路:遍歷數(shù)組a,a[i]下標(biāo)對(duì)應(yīng)的count[a[i]]++

  • count數(shù)組大小

    看樣子范圍應(yīng)該是0到a數(shù)組中最大的數(shù)?

    實(shí)則不是,如果數(shù)字是

    1000, 1001, 1100

    則從0到1100 ,浪費(fèi)了很多空間

    所以我們定義一個(gè)映射數(shù)組,所有的數(shù)字都是相對(duì)最小的數(shù)字的大小

    1000, 1001, 1100

    映射數(shù)組數(shù)字大小:a[i] - min

    0, 1, 100

    將它設(shè)置為count數(shù)組對(duì)應(yīng)下標(biāo)


2. 拷貝到原數(shù)組

這里主要是尋找數(shù)組下標(biāo)與數(shù)組值之間的對(duì)應(yīng)關(guān)系

  • count[i],拷貝的數(shù)字是i + min進(jìn)入原數(shù)組(返回映射)

  • count[i] 的數(shù)值表示,數(shù)字i需要拷貝到原數(shù)組的次數(shù)

  • 所以count數(shù)組初始值都為0

  • 拷貝一次count[i]–


二、代碼

//計(jì)數(shù)排序void CountSort(int* a, int n){	int max = a[0];	int min = a[0];	int i = 0;	//取出最大和最小值找范圍	for (i = 0; i < n; i++)	{		if (a[i] > max)		{			max = a[i];		}		if (a[i] < min) 		{			min = a[i];		}	}		//數(shù)組數(shù)字所在范圍	int range = max - min + 1;	//開(kāi)辟內(nèi)存空間,并且初始化為0	int* tmp = (int*)calloc(range, sizeof(int));		//malloc操作	//int* tmp = (int*)mallco(sizeof(int) * range);	//memset(tmp, 0, sizeof(int) * range);	if (!tmp)	{		printf("calloc fail/n");		exit(-1);	}	int* count = tmp;	//計(jì)數(shù)	for (i = 0; i < n; i++)	{		count[a[i] - min]++;	}	 	int j = 0;	//計(jì)數(shù)放回	for (i = 0; j < range; j++)	{		while (count[j]--)		{			a[i++] = j + min;		}	}	free(tmp);    tmp = NULL;}

三、測(cè)試


四、各個(gè)排序算法的穩(wěn)定性

1. 穩(wěn)定性定義

相同數(shù)值,在排序過(guò)后相對(duì)位置不發(fā)生改變

  • 前一個(gè)和后一個(gè)相同的數(shù),排序完成之后他們還是前一個(gè)還是在后一個(gè)數(shù)之前

2. 是否穩(wěn)定

  • 直接插入排序 穩(wěn)定

    因?yàn)槭前错樞颍瑥那巴螅?、2、3……個(gè)數(shù)依次插入排成有序

  • 希爾排序 不穩(wěn)定

    因?yàn)槭且詘為長(zhǎng)度,跨位置選數(shù)字組成一組開(kāi)始插入排序

  • 選擇排序 不穩(wěn)定

    選擇排序是按順序比較前后,挑出最大和最小。將大的先放在后面,再下一次可以把相同大的放在上一次的之前,順序改變。

    但會(huì)有人說(shuō)我可以通過(guò)控制代碼,來(lái)選擇第一次選到最大的那個(gè)是后面的那個(gè)數(shù)


    還有一種情況

    選擇排序算法中還有一段是這樣的,如果找到最大最小的兩個(gè)數(shù),最大的數(shù)在最小數(shù)需要放的位置,先交換最大和最小,改變序號(hào)

  • 堆排序 不穩(wěn)定

    看圖,向下調(diào)整之后位置改變


  • 冒泡排序 穩(wěn)定

    前后兩個(gè)數(shù)交換,可以控制代碼使之相對(duì)位置不改變

  • 快速排序 不穩(wěn)定

    假設(shè)最左為key,左邊找大,右邊找小

    相對(duì)位置發(fā)生改變

  • 歸并排序 穩(wěn)定

    實(shí)質(zhì)上細(xì)分來(lái)看是每個(gè)循環(huán)都是兩個(gè)數(shù)組,相對(duì)順序不變

    按照從小到大的順序歸并到一個(gè)數(shù)組,所以穩(wěn)定

  • 計(jì)數(shù)排序 穩(wěn)定

    統(tǒng)計(jì)相同數(shù)值的個(gè)數(shù),按順序映射到原數(shù)組


文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/125655.html

相關(guān)文章

  • JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法之美 - 桶排序計(jì)數(shù)排序、基數(shù)排序

    摘要:之所以把計(jì)數(shù)排序桶排序基數(shù)排序放在一起比較,是因?yàn)樗鼈兊钠骄鶗r(shí)間復(fù)雜度都為。動(dòng)畫(huà)計(jì)數(shù)排序思想找出待排序的數(shù)組中最大和最小的元素。桶排序計(jì)數(shù)排序能派上用場(chǎng)嗎手機(jī)號(hào)碼有位,范圍太大,顯然不適合用這兩種排序算法。 showImg(https://segmentfault.com/img/bVbuF9e?w=900&h=500); 1. 前言 算法為王。 想學(xué)好前端,先練好內(nèi)功,只有內(nèi)功深厚者...

    Awbeci 評(píng)論0 收藏0
  • JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法之美 - 十大經(jīng)典排序算法匯總

    摘要:筆者寫(xiě)的數(shù)據(jù)結(jié)構(gòu)與算法之美系列用的語(yǔ)言是,旨在入門(mén)數(shù)據(jù)結(jié)構(gòu)與算法和方便以后復(fù)習(xí)。這應(yīng)該是目前較為簡(jiǎn)單的十大經(jīng)典排序算法的文章講解了吧。比如原本在的前面,而,排序之后,在的后面十大經(jīng)典排序算法冒泡排序思想冒泡排序只會(huì)操作相鄰的兩個(gè)數(shù)據(jù)。 showImg(https://segmentfault.com/img/bVbvHet); 1. 前言 算法為王。想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,就...

    zsy888 評(píng)論0 收藏0
  • JS中可能用得到全部排序算法

    本篇有7k+字, 系統(tǒng)梳理了js中常見(jiàn)的12種排序算法。除了基本排序算法,文章還包含了希爾排序、堆排序、桶排序等較為復(fù)雜的排序?qū)崿F(xiàn),如果喜歡請(qǐng)點(diǎn)贊支持~謝謝. 原文: http://louiszhai.github.io/20... 導(dǎo)讀 排序算法可以稱(chēng)得上是我的盲點(diǎn), 曾幾何時(shí)當(dāng)我知道Chrome的Array.prototype.sort使用了快速排序時(shí), 我的內(nèi)心是奔潰的(啥是快排, 我只知道...

    verano 評(píng)論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)與算法——線性排序

    摘要:實(shí)際上,桶排序的應(yīng)用場(chǎng)景十分的有限,對(duì)數(shù)據(jù)的要求比較苛刻。極端情況下,如果數(shù)據(jù)全部劃分到一個(gè)桶內(nèi),就變成了非線性排序了。 1. 回顧 前面已經(jīng)說(shuō)完了幾種非線性排序,它們分別是時(shí)間復(fù)雜度為 O(n2) 、適合小規(guī)模數(shù)據(jù)的冒泡排序、選擇排序、插入排序,和應(yīng)用較廣泛的時(shí)間復(fù)雜度為 O(nlogn) 的希爾排序、歸并排序、快速排序。其實(shí)這幾種排序都有一個(gè)特性,那就是它們都是基于數(shù)據(jù)的比較和移動(dòng)...

    Allen 評(píng)論0 收藏0
  • PHP數(shù)組排序算法實(shí)現(xiàn)(14種)

    摘要:本文將介紹快速排序計(jì)數(shù)排序梳排序堆排序歸并排序希爾排序選擇排序插入排序地精排序聯(lián)合冒泡排序雞尾酒排序冒泡排序奇偶排序使用標(biāo)志的冒泡排序種排序算法的實(shí)現(xiàn)。是一種不穩(wěn)定的排序算法。 本文將介紹快速排序、計(jì)數(shù)排序、梳排序、堆排序、歸并排序、希爾排序、選擇排序、插入排序、地精排序、聯(lián)合冒泡排序、雞尾酒排序、冒泡排序、奇偶排序、使用標(biāo)志的冒泡排序14種排序算法的實(shí)現(xiàn)。本文是由于閱讀了文章《測(cè)試評(píng)...

    aisuhua 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<