用std::map、std::sort、冒泡对deque进行排序(C/C++)

同样是一道面试题,函数参数类型是deque。deque是双端队列属于动态数组类型,没有sort成员函数,只有借助其他算法或者支持排序的容器,拷贝回deque。(练习而已,时间空间复杂度不考虑了)

一、直接调std::sort,参数分别为起始迭代器,结尾迭代器(指向末元素的后面一个):

#include 
#include 
#include 
#include 
#include 

using namespace std;

template
void sort_stdalg(deque& dq)
{
	std::sort(dq.begin(),dq.end());
}

二、std::map默认按照键值排序(当然也有无序map),将deque元素作为key一个个弹到map中(删除原deque元素),完了后从map拷回到deque。注意deque的back()、pop_back()、push_back(),map的insert(pair(*,*))的使用:

template
void sort_map(deque& dq)
{
	map mpp;
	int capa=dq.size();
	for(int i=0;i(dqcur,0));
	}
	for(auto it=mpp.begin();it!=mpp.end();++it){
		dq.push_back(it->first);
	}
}

三、冒泡排序。

用std::map、std::sort、冒泡对deque进行排序(C/C++)_第1张图片

冒泡思想是底部开始遍历元素,根据轻者上浮重者下沉原则进行两两交换(相邻元素重复比较,即a1和a2、a2和a3、a3和a4),直到遍历到头元素结束。经此一役后,最轻气泡已经在头元素,在进行下一轮的从底部开始遍历元素时要注意,结束条件是是头部第二个元素。以此类推直到两个loop走完,排序结束:

template
void sort_bubble(deque& dq)
{
	int exchg=0;
	int capa=dq.size();
	T arrtmp[capa];
	for(int i=0;i=i;--j){
			if(arrtmp[j]

另外注意到如果第i次排序已经排完了,它还是会进行下一次扫描。这里记了个exchg表示当前排序已经交换过元素。如果本轮排序没有交换过,说明元素已经有序,下次排序也就没有必要了。

 

测试:

int main(int argc, char* argv[])
{
	std::deque dq1{4,2,6,1,9,8};
	printarr(dq1);
	sort_stdalg(dq1);
	printarr(dq1);

	std::deque dq2{"Bb","Aa","pP","Ee"};
	printarr(dq2);
	sort_map(dq2);
	printarr(dq2);
	
	std::deque dq3{8,6,9,2,3,7};
	printarr(dq3);
	sort_bubble(dq3);
	printarr(dq3);
	
	return 0;
}

结果:

用std::map、std::sort、冒泡对deque进行排序(C/C++)_第2张图片

 

你可能感兴趣的:(C++,C,算法)