自己动手实现数据结构——排序算法1(冒泡、插入、归并、简单选择)(C++实现)

冒泡排序

冒泡排序作为最简单的排序算法、两行for循环即可搞定。

步骤:一、从前到后依次比较相邻两个数大小,若是前面比后面大则将两个数交换位置,这样第一轮最大的一个数便会被交换到最后面。

二、重复一的步骤依次比较(但是最后一个数不需要参与比较,因为第一轮已经选出它最大),选出倒数第二大的。

。。。。

三、直到所有的数都不需要比较则排序成功

例子就不举了,直接实现:

buddle.cc

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

template< class T >
void buddle( vector<T> &a ){
    int length = a.size();
    for ( int i = length-1 ; i > 0; --i)
        for( int j = 0; j < i; j ++){
            if ( a[j] > a[j+1] )
                swap(a[j], a[j+1]);
        }
}

int main(int argc, char **argv){
    vector<int> a = {10, 8, 9, 1, 7, 4, 11, 23, 3, 2, 5};
    vector<int>::iterator iter;

    buddle<int>( a );

    for( iter = a.begin(); iter != a.end(); iter++){
        cout<< *iter <<" ";
    }
    cout << endl;

    return 0;
}

运行结果:

简单选择排序

1、从1——n个数中选择最小的数,将它放在第一位

2、从2——n个数中选择最小的数,将它放在最后一位

。。。

代码:select.cc

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

template< class T >
void select_sort(vector<T> &a){
    int length = a.size();
    int min = 0;
    for ( int i = 0; i < length; i++){
        for( int j = i; j < length; j++){
            if ( a[j] < a[min] )
                min = j;
        }
        if ( i != min )
            swap(a[i], a[min]);
    }

}

int main(int argc, char **argv){
    vector<int> a = {10, 8, 9, 1, 7, 4, 11, 23, 3, 2, 5};
    vector<int>::iterator iter;

    select_sort<int>( a );

    for( iter = a.begin(); iter != a.end(); iter++){
        cout<< *iter <<" ";
    }
    cout << endl;
    return 0;
}

运行结果

插入排序

类似于打斗地主时候的插牌程序。

每次将一个数插入一个已经排好的序列中,使之依然有序,插入的时候可以采用折半插入的形式(即采用二分查找的方式确定要插入的位置)

上代码:half_insert.cc

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

template< class T >
void half_insert(vector<T> &a){
    int length = a.size();
    int low,mid,high;
    T tmp;
    for ( int i = 1; i < length; ++i){
        low = 0;
        high = i-1;
        while( low <= high ){
            mid = (low + high)/2;
            if ( a[i] > a[mid] )
                low = mid + 1;
            else
                high = mid-1;
        }
        tmp = a[i];
        for(int j = i; j > low; --j)
            a[j] = a[j-1];
        a[low] = tmp;
    }
}

int main(int argc, char **argv){
    vector<int> a = {10, 8, 9, 1, 7, 4, 11, 23, 3, 2, 5};
    vector<int>::iterator iter;

    half_insert<int>( a );

    for( iter = a.begin(); iter != a.end(); iter++){
        cout<< *iter <<" ";
    }
    cout << endl;
    return 0;
}

运行结果:

归并排序

这里是二路归并排序

使用merge_sort递归地将序列分成两个子序列,然后再调用merge函数将两个子序列合并成一个有序的序列

代码实现:merge.cc

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

const int MAX = 0x7fffffff;

template< class T >
void merge(vector<T> &a, int begin, int mid, int end){
    int length1 = mid-begin+1;
    int length2 = end-mid+1;
    int tag1 = 0;
    int tag2 = 0;
    int tag = begin;
    vector<T> vec1(length1+1);
    vector<T> vec2(length2+1);
    for ( int i = begin ; i <= mid; i++ )
        vec1[tag1++] = a[i];
    vec1[tag1] = MAX;
    for ( int i = mid+1; i <= end; i++)
        vec2[tag2++] = a[i];
    vec2[tag2] = MAX;
    tag1 = 0;
    tag2 = 0;

    while(tag <= end ){
        if ( vec1[tag1] < vec2[tag2] )
            a[tag++] = vec1[tag1++];
        else
            a[tag++] = vec2[tag2++];
    }
}

template< class T >
void merge_sort(vector<T> &a, int begin, int end){
    if ( begin < end ){
        int mid = (begin + end)/2;
        merge_sort(a, begin, mid);
        merge_sort(a, mid+1, end);
        merge(a, begin, mid, end);
    }
}

int main(int argc, char **argv){
    vector<int> a = {10, 8, 9, 1, 7, 4, 11, 23, 3, 2, 5};
    vector<int>::iterator iter;

    merge_sort(a, 0, a.size()-1);

    for( iter = a.begin(); iter != a.end(); iter++){
        cout<< *iter <<" ";
    }
    cout << endl;
    return 0;
}

运行结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-04 13:16:31

自己动手实现数据结构——排序算法1(冒泡、插入、归并、简单选择)(C++实现)的相关文章

js排序算法总结——冒泡,快速,选择,插入,希尔,归并

相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放在前面: 如 var arr = [7, 3, 10, 1, 8, 4, 2, 4, 4, 3] 进行升序排列,排序过程如下 第一次 [3, 7, 1, 8, 4, 2, 4, 4, 3, 10] 第二次 [3, 1, 7, 4, 2, 4, 4, 3, 8, 10] 以此类推 .... 结果 [1

自己动手实现数据结构——排序算法2 (希尔、快速、堆)(C++实现)

希尔排序 又称缩小增量排序 先给数组设定一个增量,一般数组长度为len,同常将增量设为increment = len/2,increment每次缩小为原来的1/2. 1.通过这个增量给数组里的数分组:例如 0,0+increment, 0+2*increment,... 为一组   1,1+increment, 1+2*increment,...为另外一组. 2.对于每一个组通过插入算法进行排序.(前面已经写了折半插入排序,这里写的是普通插入排序) 3.increment = increment

Java中的基础排序算法(二):简单选择排序、堆排序

参考文章:https://mp.weixin.qq.com/s/VjqZNPg6dAEReAzqZcb_yw 原文链接:www.jianshu.com/p/5e171281a387 原文地址:https://www.cnblogs.com/lotuses/p/11640671.html

黑马程序员——数据结构排序算法总结

-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 下面是几个网上常见的总结图: 有些不同之处:集中在希尔排序的时间复杂度.快速归并的空间复杂度上 个人总结口诀: 选择N方-->选择排序的最好最坏平均都N方 插入冒泡最好N-->插入冒泡的最好是N,其他是N方 归并堆n乘logN-->归并希尔堆的最好最坏平均都是n乘logN 快速最坏N方-->快速排序的最坏是N方,其他是n乘logN 快速选择希尔堆不稳定-->

常见排序算法(冒泡、选择、插入、快速、归并C++实现)

常见排序算法(冒泡.选择.插入.快速.归并C++实现) #include <iostream> using namespace std; // 冒泡排序 void bubbleSort (int data[], size_t size) { for (size_t i = 0; i < size - 1; ++i) { bool ordered = true; for (size_t j = 0; j < size - 1 - i; ++j) if (data[j+1] <

数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 <数据结构(c语言版)>严蔚敏 吴伟民编著. 里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩. package test.sort; /** * @Title: TODO * @Description: TODO * @author: * @date: 2014-8-10 上午11:20:43 * */ public class quickSort { private static int datas[] = {23,42,12,45,56,63,

排序算法-(冒泡、选择、插入算法)

运行效率较慢的三大排序算法:冒泡.选择与插入算法,时间复杂度都为O(n2),运行效率较慢. #python 代码实现如下所示: li=[2,1,4,5,7,8,9,5,3]#冒泡算法(升序算法)O(n2)import randomfrom cal_time import *@cal_timedef bubble_sort(li): for i in range(len(li)-1): #第i趟 exchange=False for j in range(len(li)-i-1): #无序区域为n

九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序

  闲着的时候看到一篇“九大排序算法在总结”,瞬间觉得之前数据结构其实都有学过,但当初大多数都只是老师随口带过,并没有仔细研究一下.遂觉:这是欠下的账,现在该还了.   排序按照空间分类: In-place sort不占用额外内存或占用常数的内存 插入排序.选择排序.冒泡排序.堆排序.快速排序. Out-place sort:归并排序.计数排序.基数排序.桶排序. 或者按照稳定性分类: stable sort:插入排序.冒泡排序.归并排序.计数排序.基数排序.桶排序. unstable sort

数据结构-排序算法总结

排序算法 算法分析 算法稳定性 如果一种排序算法不会改变关键码值相同的记录的相对顺序,则称为稳定的(stable) 不稳定的算法在某种条件下可以变为稳定的算法,而稳定的算法在某种条件下也可以变为不稳定的算法.例如,对于冒泡排序算法,原本是稳定的排序算法,如果将记录交换的条件改成a[j].key>=a[j+1].key,则两个相等的记录就会交换位置.再如,快速排序原本是不稳定的排序方法,但若待排序记录中只有一组具有相同关键码的记录,而选择的轴值恰好是这组相同关键码中的一个,此时的快速排序就是稳定的