计数排序
算法思想: 统计原来数组的数据,讲数据转换成下标存储于一个临时的空间中,然后变量临时空间把对应的下标值放回原数组,当遍历临时空间完成后,原来的数组就排好序了
1 2 2 5 3 5 2 6 1 3 8
[0][1][2][3][4][5][6][7][8][9]
0 2 3 2 0 2 1 0 1 0
从小到大该下标位置的值有多少,就打印多少,遍历完成后,就排好序了
1 1 2 2 2 3 3 5 5 6 8
#define 100 N//偷个懒
int temp[N];
void countSort(int arr[],int length){
for(int i=0;i<length;i+=){
temp[arr[i]]++;
}
for(int i=0,j=0;iNN;i++){
while(temp[i]--)arr[j++]=i;
}
}
//计数排序是不稳定的排序,而且对于其中有一个非常大的数,会占用大量空间,比如1 2 5 2 999999,就需要temp[999999],因此如果计数排序适用于数值较小的数组
基数排序
举例:
154 423 365 251 78 92 640
--------------------------------------
(第一轮)(10的0次方 位即个位)640 251 92 423 154 365 78
(第二轮)(10的1次方 位即十位)423 640 251 154 365 78 92
(第三轮)(10的2次方 位即百位)78 92 154 251 365 423 640
//基数排序需要用到桶
[][][][][][][][][][]
[][][][][][][][][][]
[][][][][][][][][][]
[][][][][][][][][][]
[][][][][][][][][][]
[][][][][][][][][][]
[][][][][][][][][][]
0 1 2 3 4 5 6 7 8 9
int temp[10][N];
//先从个位开始选择放入桶中,随后从十位,百位...依次放入桶内
void redixSort(int arr[],int length){
int i;
int j;
//将对应数的放入对应的桶内,再丢回原来的数组中,就进行了一次排序
for(int k=10;k<10000;k*=10){
for(int i=0;i<length;i++){
int j=0;
int pos=(arr[i]%k)/(k/10);
while(temp[pos][j])
j++;//找到该通内无元素的位置;
temp[pos][j]=arr[i];//将arr[i]放入没有元素的位置
}
pos=0;
for(i=0;i<10;i++){//因为有10个桶
for(j=0;j<length&&temp[i][j]!=0,j++){
arr[pos++]=temp[i][j];
temp[i][j]=0;//数值拿到原数组后,将桶还原为0
//若等于0,则后面没有元素,直接退出
}
}
}
}
//定义10个桶 从0到9
//根据数从位数开始,从小到大放入十个桶中,位数也从低到高,将所有位数都遍历过之后,就已经排序好了