冒泡排序、选择排序和插入排序

引用:https://www.cnblogs.com/eniac12/p/5329396.html


注意:当直接对main函数中传入的vector操作时,需要传入引用,否则输出的结果不会改变。

1、冒泡排序:

  1. 比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
#include <iostream>
#include <vector>
using namespace std;

class bubble_sort{  //冒泡排序:双层循环
public:
    vector<int> sort(vector<int> &vec){
        int size=vec.size();
        for(int i=0;i<size-1;i++){
            for(int j=0;j<size-1-i;j++){
                if(vec[j]>vec[j+1]){   //相邻元素进行比较、交换
                    swap(vec[j],vec[j+1]);
                }
            }
        }
        return vec;
    }
    void swap(int &val1,int &val2){
        int temp=val1;
        val1=val2;
        val2=temp;
    }
};

int main(){
    bubble_sort s;
    int a[10]={3,5,7,2,1,9,0,12,6,3};
    vector<int> res(a,a+10);
    res=s.sort(res);
    for(int i:res){
        cout<<i<<',';
    }
    cout<<endl;
    return 0;
}

2、选择排序:

      初始时在序列中找到最小(大)元素,放到序列的起始位置作为已排序序列;然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

  注意选择排序与冒泡排序的区别:冒泡排序通过依次交换相邻两个顺序不合法的元素位置,从而将当前最小(大)元素放到合适的位置;而选择排序每遍历一次都记住了当前最小(大)元素的位置,最后仅需一次交换操作即可将其放到合适的位置。

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

class selection_sort{   //选择排序
public:
    vector<int> sort(vector<int> &vec){
        int size=vec.size();
        for(int i=0;i<size-1;i++){   //外层循环次数:size次,每次在剩余元素中找到一个最小的数
            int min=i;
            for(int j=i+1;j<size;j++){
                if(vec[min]>vec[j]){
                    min=j;    //找到最小元素的下标
                }
            }
            if(min!=i){    //与最小元素交换位置
                swap(vec[min],vec[i]);
            }
        }
        return vec;
    }
    void swap(int &val1,int &val2){
        int temp=val1;
        val1=val2;
        val2=temp;
    }
};

int main(){
    selection_sort s;
    int a[10]={3,5,7,2,1,9,0,12,6,3};
    vector<int> res(a,a+10);
    res=s.sort(res);
    for(int i:res){
        cout<<i<<',';
    }
    cout<<endl;
    return 0;
}

3、插入排序:

  1. 从第一个元素开始,第一个元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5
#include <iostream>
#include <vector>
using namespace std;

class insert_sort{  //插入排序
public:
    vector<int> sort(vector<int> &vec){
        int size=vec.size();
        for(int i=1;i<size;i++){  //外层循环:size-1次
            int temp=vec[i];   //取出下一个元素:i=1
            int j=i-1;      //与前面的已排序的i-1个元素依次进行比较,找到自己存放的位置
            for(j;j>=0;j--){
                if(vec[j]>=temp){    //如果该元素大于新元素temp,则该元素后移一位
                    vec[j+1]=vec[j];
                }
                else
                    break;
            }
            vec[j+1]=temp;   //否则,将新元素temp插到该元素后面
        }
        return vec;
    }
};

int main(){
    insert_sort s;
    int a[10]={3,5,7,2,1,9,0,12,6,3};
    vector<int> res(a,a+10);
    res=s.sort(res);
    for(int i:res){
        cout<<i<<',';
    }
    cout<<endl;
    return 0;
}


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页