Day3 简单选择&插入&计数&桶排序
//桶排序
void BucketSort(int a[], int num) {
int max = maxofArray(a, num);//元素最大值
int Bnum = 0;//桶的数量
int i, j, b, k;
while (max > 0) {
Bnum++;
max -= 10;
} //桶的个数
//int Buck[Maxsize][Maxsize];//用二维数组来表示桶中的元素
int(*Buck)[Maxsize] = new int[Maxsize][Maxsize];
//动态分配二维数组防止堆栈溢出
//在需要用到多个数组时,不妨考虑用二维数组来实现
for (i = 0; i <= Bnum; i++)
Buck[i][0] = 0;//每个桶的第一个元素表示该桶中的元素数量
int t;
for (i = 1; i <= num; i++) {//将元素放在桶里
b = a[i] / 10 + 1;
t = Buck[b][0] + 1;
Buck[b][t] = a[i];//
Buck[b][0]++;
}
for (i = 1; i <= Bnum; i++)
SelectSort(Buck[i], Buck[i][0]);//对每个桶里的元素进行插入排序
k = 1;
for (i = 1; i <= Bnum; i++)
for (j = 1; j <= Buck[i][0]; j++, k++)
a[k] = Buck[i][j];
for(i=0;i<Maxsize;++i)
free(Buck[i]);
// cout<<Bnum;
}
-
在运用桶排序的过程中,由于本代码里运用了每个桶的第一个元素作为桶中元素计数,因此在选择其他排序的过程中,应避免对该元素修改。 -
在设置桶的二维数组时,为了避免数组过大造成堆栈溢出,可以采用动态分配的方式创建二维数组,同时也要记得释放掉内存空间。
int (*A)[maxsize]=new int [maxsize][maxsize];
for(i=0;i<Maxsize;++i)
free(A[i]);
简单选择排序:
//简单选择排序
void SelectSort(int a[], int num) {
int i, j;
int min;
int temp;
for (i = 1; i <= num; i++) {
min = i;
for (j = i + 1; j <= num; j++) {
if (a[min] > a[j])
min = j;
}
// a[i]=a[i]+a[min];
// a[min]=a[i]-a[min];
// a[i]=a[i]-a[min];
//这种交换手法,在i和min相同时会失效
temp= a[min];
a[min] = a[i];
a[i] = temp;
}
}
插入排序
//插入排序
void InsertSort(int a[], int num) {
int i, j, k;
for (i = 1; i <= num; i++) {
a[0] = a[i];
for (j = i - 1; j > 0 && a[j] > a[0]; j--) {}
for (k = i - 1; k > j; k--)
a[k + 1] = a[k];
a[k + 1] = a[0];
}
}
计数排序
//计数排序
void CountSort(int a[], int num) {
int max = maxofArray(a, num);
int i, j;
int count[Maxsize] = { 0 };
for (i = 1; i <= num; i++) {
count[a[i] + 500]++;
//避免由于待排序数组中的元素为负数从而排序失败
}
for (j = 1, i = 0; i <= max + 500; i++) {
while ((count[i]--) > 0) a[j++] = i - 500;
}
}
在遇到使用数组下标的场景中,可以通过增加一个偏移量来达到满足负数使用的功能。
main函数
int main() {
int num;
cin >> num;
int* a = new int[10];
for (int i = 1; i <= num; i++)
cin >> a[i];
SelectSort(a,num);
print(a,num);
InsertSort(a,num);
print(a,num);
CountSort(a, num);
print(a, num);
BucketSort(a, num);
print(a, num);
return 0;
}
maxofArray函数和printf函数
void print(int a[], int num) {
for (int i = 1; i <= num; i++)
cout << a[i] << ' ';
cout << endl;
}
//求元素最大值
int maxofArray(int a[], int num) {
int max = a[1];
int i;
for (i = 1; i <= num; i++) {
if (max < a[i]) max = a[i];
}
return max;
}