计数排序是一种线性时间的排序,同时也是一种非比较排序
代码如下:
1 void CountingSort(int *data, int k, int num) // A ~ data[], B ~ aimArray[], C ~ tempArray[] 2 { 3 int *aimArray = new int[num]; 4 int *tempArray = new int[k + 1]; 5 for (int i = 0; i <= k; i++) 6 tempArray[i] = 0; 7 for (int j = 0; j < num; j++) 8 tempArray[data[j]]++; 9 for (int i = 1; i <= k; i++) 10 tempArray[i] = tempArray[i] + tempArray[i - 1];11 for (int j = num - 1 ; j >= 0; j--) 12 { 13 aimArray[tempArray[data[j]]] = data[j]; 14 tempArray[data[j]]--; 15 } 16 for (int i = 0; i < num; i++) 17 data[i] = aimArray[i + 1]; 18 }
排序例图如下:
计数排序需要用到三个数组 :
代码中 数组data[A]是待排序数组,aimArray[B]是中间数组, tempArray[C]是保存数组元素相对位置的数组
5-6行,将tempArray数组清零
7-10行, 将原数组元素相对关系储存起来, 如图中原数组{2,5,3,0,2,3,0,3} 再对照储存后的tempArray数组,数组序号代表的是data数组拥有的元素,位置0的元素为2,意味着≤0的元素有两个,所以有两个零,重新定位的时候就应该将这两个0的位置定为 0和1,位置1的元素也为2,就是那两个0,所以原数组data中没有1。依次类推,在剩余的数组中将原数组data所有的元素定好位置再放入AimArray中,最后在转移回数组data中,就完成了计数排序
时间: 2024-10-12 01:07:39