zoukankan      html  css  js  c++  java
  • 8-2.计数排序

    计数排序的基本思想是:统计一个数序列中小于某个元素a的个数为n,则直接把该元素a放到第n+1个位置上。当然当过有几个元素相同时要做适当的调整,因为不能把所有的元素放到同一个位置上。计数排序假设输入的元素都是0到k之间的整数

    // 8-2.计数排序.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    void CountSort(int a[],int b[],int array_size,int k)
    {
    	int* c=new int[k+1];
    	for (int i=0;i<=k;i++)
    	{
    		c[i]=0;
    	}
    	//c[i] contains the number of elements equal to i
    	for (int i=0;i<array_size;i++)
    	{
    		c[a[i]]++;
    	}
    	//c[i] contains the number of elements less than or equal to i
    	for (int i=1;i<=k;i++)
    	{
    		c[i]=c[i]+c[i-1];
    	}
    	//confirm the num position
    	for (int i=array_size-1;i>=0;i--)
    	{
    		b[c[a[i]]-1]=a[i];
    		c[a[i]]--;
    	}
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int a[8]={2,5,3,0,2,3,0,3};
    	int b[8];
    	CountSort(a,b,8,5);
    	for (int i=0;i<8;i++)
    	{
    		cout<<b[i]<<" ";
    	}
    	cout<<endl;
    	return 0;
    }

    对于数据2 5 3 0 2 3 0 3程序执行的过程如下图所示:

    现在有个问题,若必须是0到n的自然数,是不是用途很小?我想了想,其实可以任意整数的,即找出最小的数来,看看与0的距离d,把所有的数同时减去d,划到0到n的范围内,计数排序。到最后待恢复就可以了。

  • 相关阅读:
    使用python-gitlab包在gitlab上自动创建分组
    navicat连接远程mysql失败
    Python shell介绍
    Python任务流taskflow
    Python导包问题
    demo27-数组去重
    demo26-通过循环输出数据到页面显示
    demo25-for循环
    Visual Studio 2005 快捷键汇总
    三维立体图片效果
  • 原文地址:https://www.cnblogs.com/hdk1993/p/4652814.html
Copyright © 2011-2022 走看看