最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言排序算法之選擇排序(直接選擇排序,堆排序)

 更新時(shí)間:2022年07月14日 09:50:39   作者:保護(hù)小周?  
這篇文章主要介紹了C語(yǔ)言排序算法之選擇排序(直接選擇排序,堆排序),堆排序使用堆來(lái)選數(shù),效率高很多,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下

前言

本期為大家?guī)?lái)的是常見排序算法中的選擇排序,主要有直接選擇排序以及——堆排序(有點(diǎn)難理解),包您一看就會(huì),快來(lái)試試吧~

一、直接選擇排序

1.1 算法思想

每一次從待排序的數(shù)據(jù)元素中選出最?。ɑ蜃畲蟮模┑囊粋€(gè)元素,存放在序列的起始位置,直到全部待排序的數(shù)據(jù)元素排完。

在元素集合a[i]--a[n-1]中選擇關(guān)鍵碼最大(小)的數(shù)據(jù)元素 若它不是這組元素中的最后一個(gè)(第一個(gè))元素,則將它與這組元素中的最后一個(gè)(第一個(gè)) 元素交換 在剩余的 [a[i] , a[n-2] …… [a[i+1],a[n-1] ]集合中,重復(fù)上述步驟,直到集合剩 余1個(gè)元素。

我們拿一組實(shí)例來(lái)感受一下,直接選擇排序是怎么運(yùn)算的:

1.2 代碼實(shí)現(xiàn)

給大家?guī)?lái)一個(gè)優(yōu)化版本的直接選擇排序,一次遍歷,選出最大數(shù)和最小數(shù),然后交換,相較于傳統(tǒng)的,效率高了許多。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
 
//交換
void Swap(int* mini, int* maxi)
{
	int tmp = *mini;
	*mini = *maxi;
	*maxi = tmp;
}
 
//打印
void Print(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
}
 
//直接選擇排序
void SelectSort(int *a,int n)
{
	//下標(biāo)
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{
		int mini = begin, maxi = end;
		//選出最大的給maxi,選出最小的給mini
		for (int i=begin;i<=end;++i)
		{
			if (a[i]>a[mini])//升序
			{
				mini = i;   //改兩個(gè)if的符號(hào)即可實(shí)現(xiàn)升序、降序轉(zhuǎn)換。
			}
			if (a[i] <a[maxi])
			{
				maxi = i;
			}
		}
		//交換
		Swap(&a[begin],&a[mini]);
        //因?yàn)檫€有一種特殊情況,就是begin跟maxi重疊,然后執(zhí)行第一次交換之后,maxi記錄的是最小值
        if (begin == maxi)
		{
			maxi = mini;
		}
		Swap(&a[end], &a[maxi]);
		++begin;
		--end;
	}
}
直接選擇排序
//void SelectSort(int* a, int n)//(升序)
//{
//	for (int j=0;j<n-1;j++)//整體遍歷
//	{
//		for (int i=j+1;i<n;i++)//遍歷比較
//		{
//			if (a[j] > a[i])//比較交換
//			{
//				int tmp = a[j];
//				a[j] = a[i];
//				a[i] = tmp;
//			}
//		}
//	}
//}
int main()
{
	int a[10] = { 3,5,9,7,4,2,1,6,0,8 };
	SelectSort(a, sizeof(a) / sizeof(a[0]));
	//打印
	Print(a, sizeof(a) / sizeof(a[0]));
	return 0;
}

1.3 直接選擇排序的特征總結(jié)

  • 1.直接選擇排序的算法非常好理解,但是效率不高,實(shí)際中也很少使用
  • 2.時(shí)間復(fù)雜度:O(N^2) ,直接選擇排序不管數(shù)據(jù)的順序如何,都要遍歷至結(jié)束
  • 3.空間復(fù)雜度:O(1)
  • 4.穩(wěn)定性:不穩(wěn)定

二、堆排序

2.1 什么是堆?

2.2 判斷是否是堆

我們?cè)诮o到一個(gè)數(shù)組的時(shí)候,里面的數(shù)據(jù)往往不是“堆”,我們?cè)谑褂枚雅判虻臅r(shí)候,就需要建堆,

堆排序(Heapsort)是指利用堆積樹(堆)這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種的排序算法,它是選擇排序的一種,利用堆來(lái)進(jìn)行選擇數(shù)據(jù)。跟著我一起看看具體是怎么操作的。

建小堆排降序,建大堆排升序。

怎樣建堆呢?這里我們的前輩就設(shè)計(jì)了一種算法

2.3 向下調(diào)整算法

 堆排序的本質(zhì)是選擇排序

向下調(diào)整算法,如果是建小堆(排降序),前提:左右子樹都是小堆。大堆就是反著來(lái)。

從根節(jié)點(diǎn)開始,選出左右孩子中小的那一個(gè)跟父親比較,如果比父親小就交換,然后繼續(xù)往下調(diào)整,調(diào)整到葉子節(jié)點(diǎn)就停止。

2.4 自底向上的建堆方式

這種建堆方式是從倒數(shù)第二層的節(jié)點(diǎn)(葉子節(jié)點(diǎn)的上一層)開始,從右往左,從下到上的向下進(jìn)行調(diào)整。

2.5 代碼實(shí)現(xiàn)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//打印數(shù)據(jù)
void Printf(int* a, int n)
{
	for (int i = 0; i < n; ++i)
	{
		printf("%d ", a[i]);
	}
}
 
//交換,傳地址
void Swap(int* child, int* parent)
{
	int tmp = *child;
	*child = *parent;
	*parent = tmp;
}
//向下調(diào)整算法
//從根節(jié)點(diǎn)開始,如果是建立小堆選出左右孩子中小的那一個(gè),跟父親比較,如果比父親小就交換
void AdjustDwon(int* a, int n, int root)//建小堆
{
	int parent = root;//父親節(jié)點(diǎn)
	int child = parent * 2 + 1;//默認(rèn)是左孩子
	while (child < n)//葉子節(jié)點(diǎn)下標(biāo)不會(huì)超過(guò)數(shù)組總下標(biāo)數(shù)n
	{
		//選出左右孩子中最小的那一個(gè)
		if (child+1 < n&& a[child + 1] < a[child])
		{
			child += 1;//用a[child]與父親節(jié)點(diǎn)a[parent]比較
		}
		if (a[child] < a[parent])
		{
			//交換,傳地址
			Swap(&a[child], &a[parent]);
			//交換后,將child,作為根節(jié)點(diǎn)繼續(xù)向下調(diào)整,持續(xù)建堆
			parent = child;
			//新的左孩子
			child = parent * 2 + 1;
		}
		else
		{
			break;//如果不用交換,直接結(jié)束循環(huán)
		}
	}
}
//堆的建立
//大堆要求:樹中所有的父親都>=孩子,根是最大的
//小堆要求:書中所有的父親都<=孩子,根是最小的
//建大堆排升序,建小堆排降序
//建堆的時(shí)間復(fù)雜度是O(N);
void HeapSort(int *a,int n)
{
	//找父親節(jié)點(diǎn)
	for (int i=(n-1-1)/2;i>=0;--i)
	{
		//向下調(diào)整算法
		AdjustDwon(a,n,i);
	}
    //大堆或小堆建立完畢,排序
	//用主根節(jié)點(diǎn)與最后一個(gè)節(jié)點(diǎn)交換位置
	int end = n - 1;
	while (end>0)
	{
		//交換,傳地址
		Swap(&a[0],&a[end]);
		//繼續(xù)向下調(diào)整
		AdjustDwon(a,end,0);
		--end;
	}
}
//選擇排序—堆排序
int main()
{
	int a[10] = {9,2,5,4,3,1,6,7,8,0};
	//堆的建立
	HeapSort(a,sizeof(a) / sizeof(a[0]));
	//打印數(shù)據(jù)
	Printf(a,sizeof(a) / sizeof(a[0]));
	return 0;
}

2.6 堆排序的特性總結(jié)

  • 1.堆排序使用堆來(lái)選數(shù),效率高很多
  • 2.時(shí)間復(fù)雜度:O(N*logN)
  • 3.空間復(fù)雜度:O(1)
  • 4.穩(wěn)定性:不穩(wěn)定

2.7 堆排序的特性總結(jié)

  • 1.堆排序使用堆來(lái)選數(shù),效率高很多
  • 2.時(shí)間復(fù)雜度:O(N*logN)
  • 3.空間復(fù)雜度:O(1)
  • 4.穩(wěn)定性:不穩(wěn)定

到此這篇關(guān)于C語(yǔ)言排序算法之選擇排序(直接選擇排序,堆排序)的文章就介紹到這了,更多相關(guān)C語(yǔ)言選擇排序 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)飛機(jī)游戲(進(jìn)階版)的示例代碼

    C語(yǔ)言實(shí)現(xiàn)飛機(jī)游戲(進(jìn)階版)的示例代碼

    在前文中,已經(jīng)帶大家利用C語(yǔ)言實(shí)現(xiàn)了簡(jiǎn)單的飛機(jī)游戲,但它還存在一些缺陷。因此,本文將給大家?guī)?lái)進(jìn)階版的飛機(jī)游戲,需要的可以參考一下
    2022-10-10
  • VS2022中使用Copilot的圖文教程

    VS2022中使用Copilot的圖文教程

    大家都知道Copilot可以自動(dòng)幫助寫代碼,那么這個(gè)工具是如果使用的呢?很多朋友不是很清楚,今天小編給大家分享一篇教程關(guān)于VS2022中使用Copilot的圖文教程,感興趣的朋友一起看看吧
    2022-04-04
  • 用c語(yǔ)言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù)

    用c語(yǔ)言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù)

    本篇文章是對(duì)使用c語(yǔ)言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個(gè)數(shù),用實(shí)例進(jìn)行了分析說(shuō)明,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言實(shí)現(xiàn)大頂堆的示例代碼

    C語(yǔ)言實(shí)現(xiàn)大頂堆的示例代碼

    最大堆,又稱大根堆(大頂堆)是指根結(jié)點(diǎn)(亦稱為堆頂)的關(guān)鍵字是堆里所有結(jié)點(diǎn)關(guān)鍵字中最大者,屬于二叉堆的兩種形式之一。本文將用C語(yǔ)言實(shí)現(xiàn)大頂堆,感興趣的可以了解一下
    2022-07-07
  • C/C++中四種常用查找算法的實(shí)現(xiàn)

    C/C++中四種常用查找算法的實(shí)現(xiàn)

    C語(yǔ)言作為一種強(qiáng)大的編程語(yǔ)言,提供了多種搜索算法的實(shí)現(xiàn)方式,本文將介紹C語(yǔ)言中的四種常見搜索算法并提供每種算法的簡(jiǎn)單實(shí)現(xiàn)示例,需要的小伙伴可以參考下
    2023-11-11
  • C++ 讀取文件內(nèi)容到指定類型的變量方法

    C++ 讀取文件內(nèi)容到指定類型的變量方法

    今天小編就為大家分享一篇C++ 讀取文件內(nèi)容到指定類型的變量方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • C語(yǔ)言詳解結(jié)構(gòu)體的內(nèi)存對(duì)齊與大小計(jì)算

    C語(yǔ)言詳解結(jié)構(gòu)體的內(nèi)存對(duì)齊與大小計(jì)算

    C 數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng),本篇讓我們來(lái)了解C 的結(jié)構(gòu)體內(nèi)存對(duì)齊與計(jì)算大小
    2022-04-04
  • 一文詳解C++中隱含的this指針

    一文詳解C++中隱含的this指針

    這篇文章主要帶大家詳細(xì)了解一下C++中隱含的this指針,文中通過(guò)代碼示例和圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • 深入了解C語(yǔ)言字符函數(shù)和字符串函數(shù)

    深入了解C語(yǔ)言字符函數(shù)和字符串函數(shù)

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言字符/字符串的相關(guān)函數(shù),文中通過(guò)示例代碼總結(jié)的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Qt5.9.5 隨機(jī)轉(zhuǎn)盤小項(xiàng)目的實(shí)現(xiàn)示例

    Qt5.9.5 隨機(jī)轉(zhuǎn)盤小項(xiàng)目的實(shí)現(xiàn)示例

    本文主要介紹了Qt5.9.5隨機(jī)轉(zhuǎn)盤小項(xiàng)目的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評(píng)論

区。| 安泽县| 临武县| 泽普县| 大名县| 宝清县| 襄樊市| 桃江县| 惠安县| 西丰县| 神池县| 屯门区| 重庆市| 清远市| 六盘水市| 安多县| 读书| 乌兰县| 望都县| 台东市| 韩城市| 沂水县| 宁武县| 九寨沟县| 顺昌县| 泾阳县| 娄底市| 柳林县| 望谟县| 长治县| 商河县| 扎鲁特旗| 汽车| 新郑市| 牙克石市| 三亚市| 深水埗区| 巴彦县| 商城县| 永寿县| 长阳|