STL vector练习

由于上一节学习了STL的使用,特别学习了vector的学习,所以在这里需要去回顾练习一下。下面是我的代码,我是用vector容器,实现了冒泡排序,选择排序和快速排序。特别的,在最后着重学习一个快速排序的原理。

(一):vector练习,实现几个排序算法

//================================
// Name        : VectorTest.cpp
// Author      : hongboChen
// Version     :
// Copyright   : Your copyright notice
// Description : 由于上一节学习使用了vector,
//   所以现在练习使用一下vector的使用
//   实现了几个排序的算法
//===============================

#include <iostream>
#include <vector>

using namespace std;

void swap(int &a,int &b);
vector<int>  bubbleSort(vector<int> vec);
vector<int> selectSort(vector<int> vec);
void quickSort(vector<int> &vec,int first_lc,int last_lc);

int main() {

 //用于保存vector的大小
 int size = 0;

 cout << "Please enter the number of the array: ";
 cin >> size;

 //新建一个vector对象,并设置其大小
 vector<int> vec(size);

 //获取vector的遍历器
 //vector<int>::iterator it = vec.begin();

 //获取用户输入的数值,并赋值给vector
 cout << "Please enter the value of the array:" <<endl;

 for(int i = 0; i < size;i++){
  cin >> vec[i];
  //或者是
  //cin >> vec.at(i);
  //或者是
  //it += i;
  //cin >> *it;
 }

 //下面就是对数组进行排序
 //冒泡排序
 //vec = bubbleSort(vec);

 //选择排序
 //vec = selectSort(vec);

 //快速排序
 quickSort(vec,0,size-1);

 for(int i = 0;i < size;i++){
  cout << vec[i] << "   ";
 }

 cout << endl;

 return 0;
}

//最简单的就是冒泡排序
/**
 * 冒泡排序的思想就是
 * 每次循环的时候都是找相邻的两个元素
 * 如果相邻的两个元素符合顺序要求,就i不必切换位置
 * 如果相邻的两个元素不符合顺序要求,就将这两个元素的位置对换
 */
vector<int>  bubbleSort(vector<int> vec){
 int size = vec.size();

 //防止数组越界发生错误
 for(int i = 0;i < size-1;i++){
  for(int j = i;j < size-1;j++){
   if(vec[j] > vec[j+1])
    swap(vec[j],vec[j+1]);  //进行交换
  }
 }

 return vec;
}

/**
 *  下面是选择排序
 *  选择排序的算法思想是:
 * 首先从所有的元素中选出最大的一个元素放在数组最后
 * 接着从剩下的元素中再选出最大的一个元素放在后面
 * 以此类推,就可以排出顺序
 */
vector<int> selectSort(vector<int> vec){

 //用于保存选出的元素应该放到哪一个位置当中
 int k = vec.size()-1;

 for(int i = 0;i < vec.size();i++){
  int max_lc = 0;
  for(int j = 0;j <= k;j++){
   if(vec[j] > vec[max_lc])
    max_lc = j;
  }

  swap(vec[k],vec[max_lc]);
  k--;
 }

 return vec;
}

/**
 *  快速排序思想:算法复杂度为O(nlog(n))
 *
 *  1:从数组中选出一个元素,通常情况下是选择第一个元素,称为"基准"
 *  2:将所有的比"基准"小的元素放在基准左边,比"基准大的元素"放在基准右边
 *  3:采用递归,排序完成
 */
/**
 * vec   :  要排序的数组
 * first_lc  :  第一个元素的位置
 * last_lc   :  最后一个元素的位置
 *
 */
void quickSort(vector<int> &vec,int first_lc,int last_lc){

 if(first_lc >= last_lc)
  return;

 int i = first_lc;
 int j = last_lc;

 int key = vec[first_lc];

 while(i < j){

  while(i < j && vec[j] > key)
   j--;
  vec[i] = vec[j];

  while(i < j && vec[i] < key)
   i++;
  vec[j] = vec[i];
 }

 vec[i] = key;

 quickSort(vec,0,i-1);
 quickSort(vec,i+1,last_lc);
}

/**
 * 先设定一个交换函数
 */
void swap(int &a,int &b){
 int temp = a;
 a = b;
 b = temp;
}

(二):快速排序的原理

首先,快速排序采用的是分而治之的思想,在快速排序中,有三步:

1:从数组中选出一个元素,通常情况下是选择第一个元素,称为”基准”

2:将所有的比”基准”小的元素放在基准左边,比”基准大的元素”放在基准右边

3:采用递归,排序完成

下面结合一个例子去理解一下。

下面是一个数组:

1:我们需要定义两个数值:

int i = 0; //第一个元素的位置

int j = 5; //最后一个元素的位置

同时我们还需要一个变量来表示我们选择的基准值(也就是第一个元素值):

int key = array[i];

2:由于第一个元素即基准值被key取走了,所以我们需要找一个元素来取代这个位置,

我们刚刚看到,需要将小于基准值得元素放在其左边,所以,我们就需要从右向左找,

直到找到第一个小于基准值的元素,在这个例子中,在这个例子中,从右向左找一个小于

4的元素,在寻找过程中,j不断的在减小。

我们可以看到,当j=5 的时候,3 < 4的,所以此时

i = 0;

j = 5;

key = 4;

将位置5初的元素值替换位置0处的元素值。

3:此时,位置5处的数值3被空出来了,同理,由于需要将大于基准值得元素放在右边,所以我们需要

从左向右找到第一个大于4的值,就是6,此时

i = 2;

j = 5;

key = 4

进行替换:

4:此时,位置2处的6被空出来了,我们再从j位置开始,从右向左寻找第一个一个小于基准值的元素,

那就是1;

此时:

i = 2;

j = 4;

key = 4;

进行替换

5:我们接着再从i位置开始从左向右寻找第一个大于4的元素,就是7,则此时

i = 3;

j = 4;

key = 4;

进行替换:

当再继续进行的时候,从右向左再也找不到比4大的元素了,同时,从左向右再也找不到比4小的元素了,

所以,暂停一下,将基准值赋值给i所在位置的元素,即

array[i] = key;

则由此,比4小的都在4的左边了,比4大的都在4的右面了。

这样,将4的左边分离出来,4的右边分离出来,再进行上面同理的操作,最后就完成排序了。

时间: 2025-01-04 22:18:24

STL vector练习的相关文章

STL vector中的rbegin方法(5)

public member function <vector> std::vector::rbegin C++98 C++11 reverse_iterator rbegin() noexcept; const_reverse_iterator rbegin() const noexcept; Return reverse iterator to reverse beginning 返回一个反向的首元素. 例子: #include <iostream> #include <v

C++ STL vector容器学习

STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector,list, deque, set, map等),算法完成特定任务,迭代器用来遍历容器对象,扮演容器和算法之间的胶合剂. 模板类vector 在计算中,矢量(vector)对应数组,它的数据安排以及操作方式,与array非常类似.在C++中,使用vector模板类时,需要头文件包含#include<v

STL vector用法介绍

介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象

STL ——vector 学习

STL简介 C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等.  C++ STL 提供给程序员以下三类数据结构的实现: 标准容器类   顺序性容器  vector 从后面快速的插入与删除,直接访问任何元素  deque 从前面或后面快速的插入与删除,直接访问任何元素 list 双链表,从任何地方快速插入与删除   关联容器  

STL vector的介绍(1)

尝试下翻译STL里面的一些容易和算法.四级过了,六级刚考.顺便练练自己的英语水平,翻译的不好的地方请大神多多指教哈,方便我改正. 原来均来自:http://www.cplusplus.com/ template < class T, class Alloc = allocator<T> > class vector; // generic template Vector Vectors are sequence containers representing arrays that

C++ stl vector介绍

转自: STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是

STL vector

author:Donald-hu    theme:STL vector 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.v

STL vector使用方法介绍

介绍 这篇文章的目的是为了介绍std::vector,怎样恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该可以有效地使用vector容器,并且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,可以操作多种数据结构和算法的模板类和函数库.vector之所以被觉得是一个容器,是由于它可以像容器一样存放各种类型的对象

STL vector的构造函数和析构函数(2)

原文来自:点击打开链接 译文: public member function vector的构造器:这里我只翻译C++11的,C++98的就不翻译了. 构造器原型: <vector> std::vector::vector C++98 C++11 default (1) explicit vector (const allocator_type& alloc = allocator_type()); fill (2) explicit vector (size_type n); vec

STL vector用法介绍(转)

介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象