vlambda博客
学习文章列表

Day3 简单选择&插入&计数&桶排序

桶排序的思想:
将0-9的元素放在第一个桶里,将10-19的元素放在第二个桶里,以此类推。
再对每个桶里的元素进行排序,最终得出结果。
//桶排序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;}