`
yunchow
  • 浏览: 324359 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

c++排序算法与模板和STL

    博客分类:
  • C++
阅读更多
* 冒泡排序
一轮比较所有相邻数据对,如果顺序不合适就交换,本轮只要发生过交换就再来一轮.
#include <iostream>
using namespace std;
#include <ctime>

typedef int T ;
void sort(T a[], int n)
{
        bool bSwap = false;
        do{
                bSwap = false;
                for(int i=1;i<n;i++){
                        if(a[i] < a[i-1]){
                                swap(a[i],a[i-1]);
                                bSwap = true; 
                        }       
                }       
        }while(bSwap);
}

int main()
{
        int N=10240;   
        int a[N];   
        for(int i=0;i<N;i++)   
        a[i] = N-i;    
        time_t t1 = time(NULL);
        sort(a,N);
        time_t t2 = time(NULL);
        cout << "time:" << t2-t1 << endl;
        for(int i=0;i<10;i++)   
                cout << a[i] << ' ';    
        cout << endl;   
}


---------------------------------------
* 插入法排序
1,将头两个元素排序
2,接下来依次将每一个元素排到正确的位置
3,直到所有的元素都排完
void sort(T a[], int n)
{

        int temp;
        int p;
        for(int i=1;i<n;i++){
                temp = a[i];
                for(p=i;p>0&&a[p-1]>temp;p--)
                        a[p] = a[p-1];
                a[p] = temp;
        }
}


-------------------------------
* 快速排序法

效率最高的排序方法
选出一个分界值,把数组分成两个部分
对于分成的两个部分分别再做同样的操作

选出分界值的方法:把第一个,中间,最后一个拿出来,取中间值
//快速排序法完整方法(比较难)
void sort(T a[], int n){
	if(n<=1) return ;
	swap(*a,a[n>>1]);
	T* L = a+1;
	T* R = a+n-1;
	T v = *a;
	while(L<R){
		while(*L<v&&L<R) L++;
		while(*R>=v&&R>a) R--;
		if(L<R) swap(*L,*R);
	}
	if(v>*R) swap(*a,*R);
	sort(a,R-a);
	sort(R+1,n-(R-a)-1);
}

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
=============================================
* 模板

  + 自定义模板
  + 标准模板库(STL)
c++是一种强类型语言,一个变量类型一旦定义终身不变.
//sort.cc
//函数模板
#include <iostream>
using namespace std;

template<typename/*可写成class*/ T>	//模板头
void sort(T* a, int n){
	//code..
}
void sort(char* a[], int n){  //优先考虑非模板函数
	//code...
}
template<typename T>   //模板头
void disp(T* a, int n){
	//code...
}
int main()
{
	double ad[5] = { ... };
	int ai[7] = { ... };
	char ac[4] = { ... };
	sort(ad,5);
	sort(ai,7);
	sort<char>(ac,4);
	disp(ad,5);//或disp<double>(ad,5);
	disp(ai,7);
	
} //end main

由此,模板编程又称为通用类型编程,也叫泛型编程.
一般情况按一般处理,特殊情况特殊处理.
编译器优先选用非模板函数.
模板声明和定义不要分开.(标准里是可以的,但是几乎所有的编译器都不支持)

#include <iostream>
using namespace std;

template<typename T>
T max(T* a, int n ){
        T max = *a;
        for(int i=0; i<n; i++){
                if(a[i]>max)
                        swap(max,a[i]);
        }
        return max;
}
int main()
{
        int a[3] = {1,2,3};
        cout << max(a,3) << endl;
        double b[3] = {1.1,2.2,3.3};
        cout << max(b,3) << endl;

}


注意函数模板要放在头文件中,声明和定义都要放在头文件中.因为模板就是一个样板.

//类模板
template<typename T>
class Stack{ //.....

template<typename T>
void show(Stack<T> s){
	//code
}
int main()
{
	Stack<int> si;
//因为创建对象时不一定会传递参数,编译器不能确定类型
//在使用时,必须指定类型.其中传过去的类型也叫模板形参.
//在确定模板类型的过程称为模板的实例化.
//实例化类模板之后才会变成类,才能创建对象
	Stack<double> sd;
	Stack<char> sc;  //Stack<char>是类名
	cout << sizeof(si) << endl;//输出结果会不一样
	cout << sizeof(sd) << endl;
	cout << sizeof(sc) << endl;//所以它们不是同一个类型
}


模板名<类型实参> 共同构成类名.

#include <iostream>
#include <string>
using namespace std;

template<typename T,typename U>//类模板
struct Pairs{
        T first;
        U second;
        Pairs():first(T()),second(U()){ }
        Pairs(const T& t,const U& u):first(t),second(u){ }
};
template<typename T, typename U>//函数模板
void show(Pairs<T,U> p){
        cout << p.first << ',' << p.second << endl;
}
template<typename T, typename U>//函数模板
Pairs<T,U> mkpair(T t, U u) {
        return Pairs<T,U>(t,u);
}
int main()
{
        Pairs<int, double> p1;
        Pairs<int, string> p2(100,"Hi");
	//p1,p2是来自同一个模板的不同类型
        show(p1);
        show(p2);
        show(Pairs<char,int>('A',33));
        show(mkpair('A',33) );
}

========================================
* 标准模板库(STL)

  + 类模板叫容器,java里叫集合
  + 函数模板叫通用算法.
几乎所有的容器都有一个内部类:iterator(迭代器)
迭代器把类模板和函数模板联系在一起形成一个体系就是标准模板库(STL)
iterator里的封装了指针,但它又模仿指针操作.又称智能指针
在标准库里从来不直接用指针,用迭代来替代指针操作.
class iterator{
	T* p;
public:
	iterator(){ }
	iterator(const interator& i){ }
	iterator(T* q){ }
	operator*(){ }
	operator->(){ }
	operator++(){ }
	operator==(){ }
	operator!=(){ }
};//它是一个内部类

容器的区间是半开半闭的,*end不属于区间

* 容器的分类:
  + 序列式容器
- (重要)vector动态数组,重载的'[]'运算符
- deque(double end queue) 双端队列,首尾插入/删除数据方便
- (重要)list 双向链表
  + 关联式容器
- 所有的关联式容器都是二叉查找树模板
- map 映射 不允许重复
- multimap 多映射允许重复
- set 数据集 不允许重复
- multiset 多数据集 允许重复
* 容器的共性
  + 构造函数:都有无参,拷贝,区间构造函数
- 区间是由两个迭代器界定的一个范围.vector<int> v(beg,end)
  + 运算符的重载
- 包括: =,>,>=,<.<=,==,!=
- insert(迭代器,元素/*总是复制一份*/)//用迭代器指位置,而不是指针
- size()   //容器中已经有的元素个数
- empty()  //判断容器是否为空
- max_size()  //这一种容器最大容量
- clear() //清空整个容器
- swap(c2) //跟另一个容器交换,swap(c1,c2)不是成员函数
  + 头文件的名字跟容器的名字一致
  + begin() //返回指向第一个元素的迭代器
  + end()   //指向最后一个元素之后,因此end()指向的元素不属于这个容器

//容器例子
#include <iostream>
#include <list>
using namespace std;

int main()
{
        list<int> l1;
        int a[5] = {3,4,5,6,7};
        list<int> l2(a,a+5);
        cout << "l1.size():" << l1.size() << endl;
        cout << "l2.size():" << l2.size() << endl;
        list<int>::iterator it;
        for(it=l2.begin();it!=l2.end();it++)
                cout << *it << ' ';
        cout << endl;
        it = l2.begin();
        it ++;
        l2.erase(it);
        l2.insert(l2.begin(),100);
        l2.insert(l2.end(),200);
        for(it=l2.begin();it!=l2.end();it++)
                cout << *it << ' ';
        cout << endl;
}


0
0
分享到:
评论

相关推荐

    C++模板与STL库介绍

    C++模板和STL库是C++编程语言中的两个核心特性,它们极大地提高了代码的复用性和效率。本文将深入探讨这两个主题,并提供丰富的实践应用示例。 首先,我们来理解C++模板。模板是C++的一个强大工具,它允许程序员...

    C++库函数及STL算法

    在C++编程中,库函数和STL(Standard Template Library,标准模板库)是不可或缺的组成部分,它们极大地提升了代码的效率和可读性。本文将深入探讨C++库函数和STL算法,以及如何在实际编程中应用这些概念。 首先,...

    c++模板stl常用算法

    ### C++模板STL常用算法 #### 前言 C++是一种强大的编程语言,它支持多种编程范式,包括面向对象编程、泛型编程等。其中,泛型编程是通过模板来实现的,模板允许程序员编写能处理多种类型数据的代码。标准模板库...

    C++模板编程和STL编程

    C++ STL(Standard Template Library,标准模板库)是C++库的核心部分,它包含了一系列高效、泛型的容器(如`std::vector`、`std::list`)、迭代器、算法和函数对象。STL的目标是提供一组工具,使得开发者能够以简洁...

    C++_标准模板库(STL) pdf 高清版

    C++标准模板库(STL)是C++编程语言中不可或缺的一部分,它为开发者提供了大量高效、可重用的容器、算法和迭代器。STL的主要目标是提高代码的效率和可读性,通过使用泛型编程(也称为模板编程)来实现。以下是关于...

    《C++语言 - 标准模板库STL》_标准模板库_C++_C++STL_

    在C++编程中,标准模板库(Standard Template Library,简称STL)是一个极其重要的组成部分,它为程序员提供了高效且易用的数据结构和算法。STL是C++标准库的一个核心部分,极大地提升了代码的可读性和复用性,使得...

    C++_标准模板库(STL)

    C++标准模板库(STL)作为C++语言的核心组成部分之一,提供了丰富的通用类模板和算法集合,极大地简化了复杂数据结构的处理过程,使程序员能够更加专注于业务逻辑而非底层实现细节。STL通过标准化常用数据结构和算法,...

    C++标准模板库STL和泛型编程简介

    STL提供了大量的算法,如排序(`sort`)、查找(`find`)、复制(`copy`)等,这些算法都是模板化的,因此可以应用于任何兼容的容器。 ##### 3.4 谓词(Predicate) 谓词是在算法中使用的函数对象或函数,用于根据某些条件...

    C++模板与STL库PPT教程

    C++模板与STL库是C++编程中的重要组成部分,它们极大地增强了代码的复用性和效率。C++模板是泛型编程的基础,而STL(Standard Template Library,标准模板库)则是C++模板应用的典型代表,包含了各种高效的数据结构...

    c++STL学习——排序算法技术总结和用法代码实例(一)

    在C++编程中,STL(Standard Template Library,标准模板...总的来说,理解并熟练掌握C++STL中的排序算法对于提升代码质量和效率至关重要。通过不断实践和学习,我们可以更好地应对各种编程挑战,提升我们的编程技能。

    C++ STL--数据结构与算法实现(余文溪)示例程序代码.rar

    C++ STL,全称为Standard Template Library(标准模板库),是C++编程语言中的一部分,它提供了丰富的容器、迭代器、算法和函数对象等组件,极大地简化了数据结构和算法的实现。余文溪的《C++ STL--数据结构与算法...

    C++排序算法全集.rar

    《C++排序算法全集》是一个集合了多种排序算法实现的资源包,主要面向学习和研究C++编程语言以及算法的读者。在这个压缩包中,包含了一份名为"C++排序算法全集.pdf"的文档,该文档详细介绍了各种排序算法在C++中的...

    C++实现常用排序算法

    这些排序算法在C++中实现时,通常会利用C++的模板机制,使其能够适用于各种数据类型。同时,为了提高效率,可能会采用STL中的迭代器进行操作,以及考虑内存管理、异常安全性和性能优化等高级主题。在实际开发中,...

    C/C++ STL参考手册 STL帮助文档 中文/英文版都有

    STL,全称为Standard Template Library(标准模板库),是C++编程语言中不可或缺的一部分,它为程序员提供了高效且灵活的数据结构和算法。STL的主要组件包括容器、迭代器、算法和函数对象,这些组件共同构成了一个...

    c++标准库STL手册

    C++标准模板库(STL)是C++编程语言中的一个重要组成部分,它提供了一组高效、可重用的容器、迭代器、算法和函数对象,大大简化了数据结构和算法的实现。STL手册通常会详细阐述这些组件的使用方法,提供实例代码,...

    C++模板与STL库介绍.ppt

    C++模板与STL库介绍 本文将对C++模板和STL库进行介绍,包括模板机制、STL中的基本概念、容器概述、迭代器、算法简介等。 概论 -------- C++语言的核心优势之一就是便于软件的重用,它有两个方面体现重用:面向...

    C++ STL程序员面试题

    C++ STL,全称为Standard Template Library(标准模板库),是C++编程语言中不可或缺的一部分,为程序员提供了高效且灵活的数据结构和算法。STL的主要组件包括容器(如vector、list、set等)、迭代器、算法和函数...

    C++排序算法效率分析

    在IT领域,排序算法是计算机科学中的核心概念,特别是在编程和数据处理中。本文将深入探讨C++中几种常见的排序算法及其效率分析。C++作为一门强类型、静态类型的编程语言,提供了丰富的库函数和机制来实现高效排序。...

    stl的介绍 STL算法作为模板函数提供

    ### STL的介绍与应用 ...STL是C++中极其重要的工具库,它不仅提供了丰富的容器和算法支持,还通过模板和迭代器实现了高度的通用性和灵活性。对于C++开发者来说,熟练掌握STL是提高编程效率和代码质量的关键。

Global site tag (gtag.js) - Google Analytics