1. 程式人生 > >[資料結構]用插入排序和選擇排序的思想實現優先順序佇列

[資料結構]用插入排序和選擇排序的思想實現優先順序佇列

一、問題概述

優先順序佇列的定義:

       優先順序佇列不同於普通的佇列,普通的佇列具有先進先出的原則,而優先順序佇列是選擇優先順序最高的先出隊。那麼,如何模擬實現優先順序佇列呢?在這裡,我們將較大的值作為優先順序較高的。

二、解決思路

      (1)用插入排序的思想,將它們按由大到小(也可由小到大)排好序,再push到佇列中,那麼佇列中的隊首元素便是優先順序最高的,取其front,便可得到優先順序最高的值。

        此時,push的時間複雜度為(O(1)),pop的時間複雜度為(O(N)),Top的時間複雜度為(O(1)).

      (2)用選擇排序的思想,選擇出值最大的那個元素,將其push到佇列中,再取次大的,push到佇列中,依次下去,將所有值push到佇列中,那麼佇列中的隊首元素便是優先順序最高的,取其front,便可得到優先順序最高的值。

       此時,push的時間複雜度為(O(N)),pop的時間複雜度為(O(1)),Top的時間複雜度為(O(N)).


那麼,根據時間複雜度來看,兩種演算法哪一個更好呢?

解析一下:(如果不考慮取Top(),比較插入排序和選擇排序)

插入排序:push時間複雜度為(O(1)),pop時如果無序的話,它是O(N),但是如果本身是有序的話,pop的時間複雜度就為(O(1)),它是可變的,分最好最壞;

但是選擇排序就不一樣了,它的push的複雜度永遠都為(O(N)),pop的時間複雜度為(O(1));


綜上所述,插入排序的思想實現優先順序佇列更好。

下面把兩種優先順序佇列都實現一下吧~~

三、實現程式碼

//插入排序實現優先順序佇列
#pragma once
#include<iostream>
using namespace std;
#include<queue>
#include<assert.h>

template<typename T>
T QueuePriority(T *arr1,size_t size)
{
	assert(arr1);
	queue<T> q;
	T arr2[7] = {0};
	arr2[0] = arr1[0];
	for(size_t i = 1; i < size; ++i)
	{
		if(arr2[i-1] <= arr1[i])
		{
			arr2[i] = arr1[i];
		}
		else
		{
			size_t j = 0;
			for(j = i-1; j >= 0; --j)
			{
				if(arr2[j] > arr1[i])
				{
					arr2[j+1] = arr2[j];
				}
				else
				{
					break;
				}
			}
			arr2[j+1] = arr1[i];
		}
	}

	for(int k = size-1; k >= 0; k--)
	{
		q.push(arr2[k]);
	}

	return q.front();
}


void FunTest()
{
	int arr1[] = {1,3,5,4,2,6,0};
	char arr2[] = {'a','d','b','c'};
	size_t size = sizeof(arr1)/sizeof(arr1[0]);
	size_t size1 = sizeof(arr2)/sizeof(arr2[0]);

	cout<<QueuePriority<int>(arr1,size)<<endl;
	cout<<QueuePriority<char>(arr2,size1)<<endl;
}

int main()
{
	FunTest();
	return 0;
}


//用選擇排序實現優先順序佇列
#pragma once
#include<iostream>
using namespace std;
#include<queue>
#include<assert.h>

template<typename T>
T QueuePriority(T *arr1,size_t size)
{
	assert(arr1);
	queue<T> q;

	for(size_t i = 0; i < size; ++i)
	{
		T max = i;	
		for(size_t j = i+1;j < size; ++j)
		{
			if(arr1[max] < arr1[j])
			{
				max = j;
			}
		}
		swap(arr1[max],arr1[i]);
		q.push(arr1[i]);
	}
	return q.front();
}

void FunTest()
{
	int arr1[] = {1,3,5,4,2,6,0};
	char arr2[] = {'a','d','b','c'};
	size_t size = sizeof(arr1)/sizeof(arr1[0]);
	size_t size1 = sizeof(arr2)/sizeof(arr2[0]);

	cout<<QueuePriority<int>(arr1,size)<<endl;
	cout<<QueuePriority<char>(arr2,size1)<<endl;
}

int main()
{
	FunTest();
	return 0;
}


相關推薦

[資料結構]插入排序選擇排序思想實現優先順序佇列

一、問題概述 優先順序佇列的定義:        優先順序佇列不同於普通的佇列,普通的佇列具有先進先出的原則,而優先順序佇列是選擇優先順序最高的先出隊。那麼,如何模擬實現優先順序佇列呢?在這裡,我們將

(九)數據結構之簡單排序算法實現:冒泡排序插入排序選擇排序

html lan 獎章 tmx 4tb wot 數據結構 lec get d59FG8075P7伊http://www.zcool.com.cn/collection/ZMTg2NTU2NjQ=.html 312V畏蝗淤ZP哦睬http://www.zcool.com.c

排序(上):氣泡排序插入排序選擇排序

如何分析一個排序演算法? 分析一個排序演算法的三要素:排序演算法的執行效率、排序演算法的記憶體消耗以及排序演算法的穩定性。 排序演算法的執行效率 對於排序演算法執行效率的分析,一般是從以下三個方面來衡量: 最好情況、最壞情況、平均情況時間複雜度 時間複雜度的係數、常數、低階 比較次數和交

排序(上):冒泡排序插入排序選擇排序

最壞情況 選擇排序 main 評價 先後 序列 emp 復雜度 基本思想 如何分析一個排序算法? 分析一個排序算法的三要素:排序算法的執行效率、排序算法的內存消耗以及排序算法的穩定性。 排序算法的執行效率 對於排序算法執行效率的分析,一般是從以下三個方面來衡量: 最好情況

排序演算法上——氣泡排序插入排序選擇排序

1. 排序演算法? 排序演算法應該算是我們最熟悉的演算法了,我們學的第一個演算法,可能就是排序演算法,而在實際應用中,排序演算法也經常會被用到,其重要作用不言而喻。 經典的排序演算法有:氣泡排序、插入排序、選擇排序、歸併排序、快速排序、計數排序、基數排序、桶排序。按

07-看圖理解資料結構與算法系列(選擇排序)

選擇排序 選擇排序是一種很簡單直觀的排序演算法,主要思想就是每次從待排序的元素中選擇出最大或最小的那個元素,然後將其放至已排序序列的末尾,直到全部待排序序列都排序完畢。 排序要點 初始狀態時,待排序序列為a1,a2,...an,已排序序列為空。 第一趟排序,從

資料結構與演算法C++之選擇排序

本篇文章是使用C++實現的選擇排序演算法,演算法複雜度為O(n2) 選擇排序演算法初始時在序列中找到最小元素,放到序列的起始位置作為已排序序列;然後,再從剩餘未排序元素中繼續尋找最小元素,放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。 如上圖陣列中有8個元素,首先將第一個元素

java實現氣泡排序選擇排序

氣泡排序:依次比較兩個相鄰的元素,將值大的元素交換至右端,一輪比較過後,最大的元素在最右端。 public class BubbleSort { public static void main(String[] args) { int[] arr

插入排序選擇排序

sel () cti spa i++ ins div style 插入 插入排序: 1 #include <stdio.h> 2 #define LEN 5 3 4 int a[LEN] = {10, 5, 2, 4, 7}; 5 6 void

Atitit order algo 排序演算法 演算法之道 目錄 1.1. 生活中常用的排序插入排序選擇排序 2 2. 0.1 演算法分類 2 3. .2 演算法複雜度 3 4. 十大經典排序演算法(動圖

Atitit order algo 排序演算法 演算法之道   目錄 1.1. 生活中常用的排序是插入排序和選擇排序 2 2. 0.1 演算法分類 2 3. .2 演算法複雜度 3 4. 十大經典排序演算法(動圖演示) 2 4 4.1. 0、演算法概述 2 4

C 冒泡排序選擇排序

true 不能 學習 print 出現 std src log stdio.h 冒泡排序 理論: 從第一個數開始,將相鄰的兩個數比較,第一個數和第二個數比較.....,要是是從小到大的排序,要是後面的數比前面的大則交換兩個的位置,這樣第一輪比較基數後

使用C語言和Java分別實現冒泡排序選擇排序

都沒有 img 容易 n) 不穩定排序 實現 imp 結果 輸出 經典排序算法——冒泡和選擇排序法 Java實現冒泡排序 基本思想是,對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素放到頂端,最終達到完全有序,首先看個動圖: 我們要清楚一點,

冒泡排序 選擇排序的 區別 python

實現 pytho www 依次 body n-1 sel 把他 第一個 參考:https://www.cnblogs.com/banana201/p/4928733.html ## 冒泡排序法(Bubblesort) ##所謂排序法,就是對一組無序的序列進行有序的排序(

冒泡排序選擇排序的源碼兩者之間的復雜度簡介

循環 第一次 交換 排序 算法 AS pre 排序算法 n! 冒泡排序 冒泡排序算法原理 * 1 比較相鄰的元素,如果前一個比後一個大,就把它們兩個調換位置。 * 2 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。

氣泡排序選擇排序的簡單使用

      這裡主要介紹一下氣泡排序和選擇排序的簡單使用,給初學者一些參考,可能和別人的有點不一樣,這主要是我自己的一些思路,和別人是有一些出入的。       直接上程式碼,註釋在程式碼中: packag

JAVA中陣列氣泡排序選擇排序

氣泡排序的思想:兩兩之間比較大小,小的數在前,大的數在後。共比較i-1次。 static void MaoPaoArray(int[] a) { for (int i = 0; i < a.length - 2; i++) { for (int j = 0; j <

氣泡排序選擇排序演算法的實現(c/c++)

一 選擇排序:   選擇排序的工作原理是從 待排序的元素中選出最小或者最大的一個元素,存放在序列的起始位置,直到全部待排序的元素排完。這是一種不穩定的排序方法。比氣泡排序快。 二 氣泡排序:   氣泡排序重複訪問要排序的元素,依次比較兩個相鄰的元素。如果前一個元素大於

python中氣泡排序選擇排序及其區別

氣泡排序:每次去相鄰的兩個元素比較,不合適就交換,依次向後 選擇排序:將第一個元素和後面的元素挨個輪流比較,如果按照從小到大排序,大的排序往後面 #排序函式 def paixu(li): for j in range(1, len(li)): #j是外層迴

【c語言】氣泡排序選擇排序

1.氣泡排序 氣泡排序將一個列表中的兩個元素進行比較,並將最小的元素交換到頂部。兩個元素中較小的會冒到頂部,而較大的會沉到底部,該過程將被重複執行,直到所有元素都被排序。 氣泡排序示意圖 以如圖所示的氣泡排序為例,每次比較相鄰的兩個值,值小的交換到前面,每輪結束後值最大的數交換到了

氣泡排序選擇排序

** – **冒泡和選擇排序演算法的測試 雖然不難但在細節方面有時候會在交換位置時出錯,這一塊一定得細心。 程式碼如下: class Sorts { public static void main(String[] args) { long b