排序算法之珠排序

排序算法之珠排序

        基本思想:将每个数用珠子表示,例如:数字5就是5个珠子。用珠子表示好每一个数后,让所有的珠子自由下落。排序完成。

        例如:数字,{6, 2, 4, 1, 5, 9}

        (1)将这些数都用珠子表示。

       (2)让珠子自由下落。

完成了排序{1, 2, 4, 5, 6, 9}

BOOL BeadSort(datatype *array, int size)
{
	char **bead;
	int i, j, k, n, len;

	if(array == NULL) {
		return FALSE;
	}

//确定每行珠子的最大个数
	GetMax(array, size, &len);
//初始化
	bead = (char **)calloc(size, sizeof(char *));
	if(bead == NULL) {
		return FALSE;
	}

	for(i = 0; i < size; i++) {
		bead[i] = (char *)calloc(len, sizeof(char));
		if(bead[i] == NULL) {
			return FALSE;
		}
	}

	for(i = 0; i < size; i++) {
		for(j = 0; j < array[i]; j++) {
			bead[i][j] = 1;
		}
	}
//初始化完毕,将所有的数按顺序用珠子表示。

//让珠子自由下落
        for(j = 0; j < len; j++) {
		i = k = size-1;
		while(i >= 0) {
			if(bead[i--][j] == 1) {
				bead[k--][j] = 1;
			}
		}

		while(k >= 0) {
			bead[k--][j] = 0;
		}
	}
//自由下落完毕

//收集珠子,统计每一行有多少个珠子
        for(i = 0; i < size; i++) {
		j = n = 0;
		while(j < len) {
			if(bead[i][j++] == 0) {
				break;
			}
			n++;
		}

		array[i] = n;
	}
//排序完成
	return TRUE;
}

          待排序序列:{9, 11, 15, 20, 19, 0, 5, 1, 10, 17, 13, 15, 11, 19, 11, 7, 20, 6, 10}          

         (1)初始化,用珠子表示数字。

                                                                        

          (2)让珠子自由下落

                                                                        

         排序完成。{0, 1, 3 ,5 ,6, 7, 9, 10 ,10 , 11, 11, 11, 13, 15, 16, 17, 19, 19, 20, 20}

时间: 2024-08-30 02:35:35

排序算法之珠排序的相关文章

Javascript排序算法之计数排序的实例

 计数排序是一种高效的线性排序,它通过计算一个集合中元素楚翔的次数来确定集合如何排列,计数排序不需要进行数据的比较,所有他的运行效率前面介绍的都高 计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个额外的数组Count_arr,其中第i个元素是待排序数组Arr中值等于i的元素的个数.然后根据数组Count_arr来将Arr中的元素排到正确的位置. 分为四个步骤: 1.找出待排序的数组中最大和最小的元素 2.统计数组中每个值为i的元素出现的次数,存入数组Count_arr

Javascript排序算法之合并排序的2个例子介绍

 这篇文章主要介绍了Javascript排序算法之合并排序(归并排序)的2个例子,需要的朋友可以参考下 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.   归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列.   归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(

Javascript排序算法之计数排序的实例_javascript技巧

计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个额外的数组Count_arr,其中第i个元素是待排序数组Arr中值等于i的元素的个数.然后根据数组Count_arr来将Arr中的元素排到正确的位置.分为四个步骤:1.找出待排序的数组中最大和最小的元素2.统计数组中每个值为i的元素出现的次数,存入数组Count_arr的第i项3.对所有的计数累加(从Count_arr中的第一个元素开始,每一项和前一项相加)4.反向遍历原数组:将每个元素i放在新数组的第Count_arr

排序算法之耐心排序

排序算法之耐心排序      耐心排序的基本思想:耐心排序还是对插入排序做的一种优化,先将数据调整为基本有序,再进行一次插入排序.耐心排序的关键点是在建桶和入桶的规则上面.      (1)如果还没有桶,新建一个桶.如果不符合入桶规则那么新建一个桶.      (2)要入桶的数字只要比桶里最上面的数字小,即可入桶:如果有多个桶可入,则按照从左到右的顺序入桶.      举例:有待排序序列6, 3, 4, 7, 1, 2, 8,5      (1)取数据6,目前还没有桶,则新建桶[1],将6入桶.

排序算法之地精排序

排序算法之地精排序      地精排序是最简单的排序算法,它只用一重循环就可以实现.它也像冒泡排序一样,相邻元素之间两两进行比较,如果这两个元素逆序,则交换.与冒泡排序不同的是,它如果遇到交换操作时,变为向前冒泡,直至不发生交换操作位置.相当于做了一个插入操作,将比较小的数插入到前面的有序序列中合适的位置.所以,地精排序可以说是冒泡排序和直接插入排序的综合.      其排序过程如下:循环变量i初值为0.进入循环,当i为0时什么也不做,直接i++.当i不为0时,比较下标为i和i-1的数值,如果正

排序算法之奇偶排序

排序算法之奇偶排序      奇偶排序的基本思想就是先对奇数列进行一趟排序,比较奇数列和其相邻的偶数列的元素,如果逆序则交换.再对偶数列进行一趟排序,比较偶数列和其相邻的奇数列的元素,如果逆序则交换.接着对奇数列进行排序,再对偶数列进行排序,重复进行这样的过程,直到奇数列排序和偶数列排序都没有进行交换操作为止.      例如:待排序序列{6, 2, 4, 1, 5,7}      对奇数列和其相邻的偶数列进行排序:比较2与4,比较1与5.不进行交换操作.      对偶数列和其相邻的奇数列进行

排序算法之梳排序

排序算法之梳排序      基本思想:梳排序和希尔排序很类似.希尔排序是在直接插入排序的基础上做的优化,而梳排序是在冒泡排序的基础上做的优化.也是想希尔排序一样,将待排序序列通过增量分为若干个子序列,然后对子序列进行一趟冒泡排序,一步步减小增量,直至增量为1.所以梳排序的最后一次排序是冒泡排序.      梳排序增量是根据递减率减小的,递减率的设定影响着梳排序的效率,原作者以随机数作实验,得到最有效递减率为1.3的.      举例:待排序序列为{8, 6, 5, 2, 1, 4, 3,7}  

JavaScript排序算法之希尔排序的2个实例_基础知识

插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率.但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位.希尔排序按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布.一些老版本教科书和参考手册把该算法命名为Shell-Metzner,即包含Marlene Metzner Norton的名字,但是根据Metzner本人的说法,"我没有为这种算法做任何事,我的名字不应该出现在算法的名字中." 希尔排序基本思想:先取一个小于n的

内部排序算法:希尔排序

基本思想 先取一个小于n的整数d1作为第一个增量,把待排序的全部记录分成dx个组.所有距离为d1的倍数的记录放在同一个组中. 先在各组内进行直接插人排序. 然后,取第二个增量d2<d1重复上述的分组和排序. 直至所取的增量dt=1(dt<dt-x<-<d2<d1),即所有记录放在同一组中进行直接插入排序为止. 算法实现 希尔排序算法,Java实现,代码如下所示: 01 public abstract class Sorter { 02 public abstract void