STL练习2 实现插入排序,箱子排序和基数排序

使用list实现了排序的中比较简单的插入排序,箱子排序和基数排序,其中,箱子排序和基树排序只能用于数的排序,所以限制还是蛮大的,箱子排序在实际使用中基本上不使用,箱子排序是基数排序的基础,基数排序有MSD和LSD,MSD也就是从最高位开始向最低位排序,LSD也就是从最低位向最高位排序。

下面附上我的实现代码:

//============================================================================
// Name        : STLPractice2.cpp
// Author      : 陈洪波
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <list>

using namespace std;

void selecrSort(int test[],int size);

void bulletSort(int test[],int size);

void radixSort(int test[],int size,int wei);
/**
 * 实现插入排序,箱子排序和基数排序
 */
int main() {
    int test[]= {2,1,4,3};

    //selecrSort(test,4);

//  for(int i = 0;i < 4;i++){
//      cout << test[i] << " ";
//  }

    //bulletSort(test,4);

    radixSort(test,4,1);

    for(int m = 0;m < 4;m++){
            cout << test[m] << "    ";
    }
        cout << endl;
    return 0;
}

/**
 * 插入排序
 * 假定数组的第一个元素是排好序的,则从第二个元素开始
 * 与前面的元素进行排序,这样就可以实现排序了
 * 例如: 2 1 4 3
 * 假设第一个元素2已经排好序了
 * 则从第二个元素1开始,向前找,2大于1
 * 则将2向后移动,最后将1插入到2的位置
 * 就变成了 1 2 4 3
 * 4比2大,则就保持4所在的位置
 * 3比4小,则4后移,比2大,则3放在4的位置
 * 这样排序就完成了
 * 1 2 3 4
 */
void selecrSort(int test[],int size){
    if(size == 1)
            return;

        int i = 1;
        for(i = 1;i < size;i++){

            if(test[i-1] > test[i]){
                int temp = test[i];

                int j = i-1;
                while(j>=0 && test[j] >= temp){
                    test[j+1] = test[j];

                    j--;
                }

                test[j+1] = temp;
            }
        }
}

//获取数组中的最大元素
int Max(int test[],int size){
    int i = 0;
    int max = test[0];
    for(i = 1;i < size;i++){
        if(test[i] > max)
            max = test[i];
    }

    return max;
}

//获取数组中的最小元素
int Min(int test[],int size){
    int i = 0;
    int min = test[0];

    for(i = 1;i < size;i++){
        if(test[i] < min)
            min = test[i];
    }

    return min;
}

/**
 * 箱子排序
 * 箱子排序就是相当于桶排序,将每一个不一样大小
 * 的数放入到代表不同数字的桶中,最后再将桶中的元素顺序输出
 */
void bulletSort(int test[],int size){

    int max = Max(test,size);
    int min = Min(test,size);

    //暂时使用List
    list<int> *lists = new list<int>[max-min+1]();

    int i = 0;
    for(i = 0;i < size;i++){
        lists[test[i]-min].push_back(test[i]);
    }

    //输出
    for(i = 0;i < max-min+1;i++){
        list<int>::iterator it = lists[i].begin();

        cout << *it << " ";
    }
}

/**
 * 基树排序(有MSD和LSD)
 * 现在先实现最简单的基数排序,就是对数字只有从小到大排序,没有类别之分
 * 基数排序的思想就是:
 * 先对个位数字进行排序,排序完成之后,统计成堆
 * 接着对上面排好序的十位数字进行排序,排序完成之后,再进行对
 * 排好序的百位数字排序,一次类推
 */
void radixSort(int test[],int size,int wei){
    int i = 0;
    int m = 0;

    for(m = 1;m <= wei;m++){
        //还是采用list作为桶
        list<int> *lists = new list<int>[10];

        for(i = 0;i < size;i++){
            int temp = test[i];

            int loc = 1;
            int tt = 1;
            for(tt = 1;tt < m;tt++){
                loc *= 10;
            }

            lists[(temp/loc%10)].push_back(test[i]);
        }

        int j = 0;
        for(i = 0;i < 10;i++){

            if(lists[i].size() != 0){
                list<int>::iterator it = lists[i].begin();

                while(it != lists[i].end()){
                    test[j] = *it;
                    it++;
                    j++;
                }
            }

        }
    }
}

/**
 * 用于对a和b交换
 */
void swap(int &a,int &b){
    int temp = a;
    a = b;
    b = temp;
}

时间: 2024-10-13 06:24:33

STL练习2 实现插入排序,箱子排序和基数排序的相关文章

链表的应用——箱子排序和基数排序

单向链表的实现 数据结构它描述的是数据和数据之间的关系.数据结构要三大要素:逻辑结构,描述数据和数据之间的关系,分为线性结构和非线性结构两种,所谓线性结构指的就是这种数据结构描述的数据之间存在这样的关系,除了首元素和微元素,任何元素都存在一个唯一前驱和唯一后继(前驱通俗的说就是这个元素的前一个元素,后继就是这个元素的后一个元素),而非线性结构中的数据元素之间就不存在这种关系,而是用父节点子节点的关系来描述,也就是说前驱后继不存在唯一性:存储结构,所谓存储结构,实际上指的就是怎么它数据之间的逻辑结

C++ STL中Map的按Key排序和按Value排序

原文  http://blog.csdn.net/iicy266/article/details/11906189 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学

箱子排序

概述:先根据被排序对象的属性值的最小值到最大值建立并编号一连串连续有序的箱:然后遍历一遍需要被排序的对象序列,每遍历到一个对象都根据其属性值找到并装入对应编号的箱子直到遍历完毕,这样会使不同属性值的对象在不同序号的箱子中,而相同属性值的对象则在同一编号的箱子中:最后再遍历一遍箱子序列并删掉对象个数为0的空箱子,则剩余的箱子序列即为有序的对象序列. 建议数据结构:如果有需要对于箱子序列最好使用链表类的容器,这样会更加容易删除对象个数为0的空箱子. 示例: 问题:对下面的序列进行排序: {7,11,

插入排序—希尔排序(Shell`s Sort)原理以及Java实现

希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序. 操作方法: 选择一个增量序列t1,t2,-,tk,其中ti>tj,tk=1: 按增量序列个数k,对序列进行k 趟排序: 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序.仅增量因子为

插入排序) 希尔排序 (最小增量排序)

/** * (插入排序) 希尔排序 (最小增量排序) * @author Cinn * */public class shellSort { /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        int[] array= {48,58,50,98,69,51,27,99,100};        shlees

C++ STL中Map的按Key排序跟按Value排序(转)

C++ STL中Map的按Key排序和按Value排序 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学生姓名快速的查找到 他的成绩. 但是,我们除了希望能够查询

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)

综述 最近复习了各种排序算法,记录了一下学习总结和心得,希望对大家能有所帮助.本文介绍了冒泡排序.插入排序.选择排序.快速排序.归并排序.堆排序.计数排序.桶排序.基数排序9种经典的排序算法.针对每种排序算法分析了算法的主要思路,每个算法都附上了伪代码和C++实现. 算法分类 原地排序(in-place):没有使用辅助数据结构来存储中间结果的排序**算法. 非原地排序(not-in-place / out-of-place):使用了辅助数据结构来存储中间结果的排序算法 稳定排序:数列值(key)

冒泡排序,快速排序,归并排序,插入排序,希尔排序,堆排序,计数排序,桶排序,基数排序

选择排序,冒泡排序,快速排序,归并排序,插入排序,希尔排序,计数排序,桶排序,基数排序 以上是一些常用的排序算法. 选择排序 for(int i = 0; i < n; i++) { int minval = a[i]; int minid = i; for (int j = i+1; j < n; j++) { if (a[j] < minval) { minid = j; minval = a[j]; } } swap(a[i], a[minid]); } 最简单的就是选择排序,就是

【数据结构】非比较排序算法(实现计数排序和基数排序)

● 计数排序 1.算法思想: 计数排序是直接定址法的变形.通过开辟一定大小的空间,统计相同数据出现的次数,然后回写到原序列中. 2.步骤: 1)找到序列中的最大和最小数据,确定开辟的空间大小. 2)开辟空间,利用开辟的空间存放各数据的个数. 3)将排好序的序列回写到原序列中. 具体实现如下: void CountSort(int *arr, int size) {  assert(arr);  int min = arr[0];  int max = arr[0];  int num = 0;