一个o(n)的排序算法,类位图排序
2006-12-07 22:55
162 查看
基本思想:
定义一个带排序数中的最大数为DataForStore数组长度,一遍扫描带排序数组,将其值作为DataForStore数组中对应下标的数加1,随后在DataForStore数组中即是一排序号的数,顺序输出即可。
当然该算法有条件限制,如排序数中的最大数不能太大,至于DataForStore数组可以采用位存储方案,这里为了便于实验,即忽略空间要素。。。。。。
只是扫描一遍数组即完成排序,真正的O(N)复杂度
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
BitMap bm = new BitMap(1000000, 10000);
bm.CreateRandomData();//产生随机数
bm.Sort();//排序
bm.PrintDataAfterSort();//输出
Console.ReadLine();
}
}
class BitMap
{
public int DateLenth;
public int MaxNumber;
public int[] DataForStore;
public int[] DataForSort;
/// <summary>
///
/// </summary>
/// <param name="datelenth">带排序个数</param>
/// <param name="maxnumber">带排序最大数</param>
public BitMap(int datelenth, int maxnumber)
{
DateLenth = datelenth;
MaxNumber = maxnumber;
DataForStore = new int[maxnumber];
}
/// <summary>
/// 产生随机数,便于测试
/// </summary>
public void CreateRandomData()
{
Random r = new Random();
DataForSort = new int[DateLenth];
for (int i = 0; i < DateLenth; i++)
{
DataForSort[i] = r.Next(MaxNumber);
}
}
/// <summary>
/// 排序
/// </summary>
public void Sort()
{
for (int i = 0; i < DateLenth; i++)
{
DataForStore[DataForSort[i]]++;
}
}
/// <summary>
/// 输出排序后的数据
/// </summary>
public void PrintDataAfterSort()
{
for (int i = 0; i < MaxNumber; i++)
{
for (int j = 0; j < DataForStore[i]; j++)
{
Console.Write(i+",");
}
}
}
}
}
定义一个带排序数中的最大数为DataForStore数组长度,一遍扫描带排序数组,将其值作为DataForStore数组中对应下标的数加1,随后在DataForStore数组中即是一排序号的数,顺序输出即可。
当然该算法有条件限制,如排序数中的最大数不能太大,至于DataForStore数组可以采用位存储方案,这里为了便于实验,即忽略空间要素。。。。。。
只是扫描一遍数组即完成排序,真正的O(N)复杂度
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
BitMap bm = new BitMap(1000000, 10000);
bm.CreateRandomData();//产生随机数
bm.Sort();//排序
bm.PrintDataAfterSort();//输出
Console.ReadLine();
}
}
class BitMap
{
public int DateLenth;
public int MaxNumber;
public int[] DataForStore;
public int[] DataForSort;
/// <summary>
///
/// </summary>
/// <param name="datelenth">带排序个数</param>
/// <param name="maxnumber">带排序最大数</param>
public BitMap(int datelenth, int maxnumber)
{
DateLenth = datelenth;
MaxNumber = maxnumber;
DataForStore = new int[maxnumber];
}
/// <summary>
/// 产生随机数,便于测试
/// </summary>
public void CreateRandomData()
{
Random r = new Random();
DataForSort = new int[DateLenth];
for (int i = 0; i < DateLenth; i++)
{
DataForSort[i] = r.Next(MaxNumber);
}
}
/// <summary>
/// 排序
/// </summary>
public void Sort()
{
for (int i = 0; i < DateLenth; i++)
{
DataForStore[DataForSort[i]]++;
}
}
/// <summary>
/// 输出排序后的数据
/// </summary>
public void PrintDataAfterSort()
{
for (int i = 0; i < MaxNumber; i++)
{
for (int j = 0; j < DataForStore[i]; j++)
{
Console.Write(i+",");
}
}
}
}
}
相关文章推荐
- 已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。 给定一个int数组A,同时给定
- 排序算法不稳定(快排)在一个待排序队列中,A和B相等,且A排在B的前面,而排序之后,A排在了B的后面.
- PHP处理一个5G文件,使用内存512M的,数据为整形,从大到小排序,优化排序算法
- 请用Java实现冒泡、插入、选择排序中的任意一个排序算法。
- 闲了,再写写排序算法,一个最麻烦的归并排序。
- 一个有趣的排序算法—睡眠排序
- 实现一个排序算法,对0~n-1范围内的n个不重复的无序数组进行排序,时间复杂度为O(n),空间复杂度为O(1)。
- js 快速数组排序 Array sort()排序算法 splice()
- Java常用排序算法冒泡排序与选择排序总结
- 排序算法之直接插入排序
- 位图 c++ 位图排序
- 经典排序算法系列之三:交换排序
- 排序题一个
- 常见的排序算法(Java实现):冒泡、插入、选择、快速排序
- 排序算法(一):插入排序(直接插入排序、希尔排序)
- 使用EF6和MVC5实现一个简单的选课系统--排序、过滤和分页(3/12)
- java输出一个数组的所有排列形式(全排序)
- 两个排序算法--冒泡排序,选择排序
- SQL的一个排序问题
- 一个字符数组,里面的字符可能是a-z、A-Z、0-9.现在要求对数组进行排序,要求所有小写字符放在最前面,所有大写字符放在中间,所有数字放在最后,而且各部分内部分别有序(创新工场)