Compare commits

...

4 Commits

@ -0,0 +1,48 @@
/*原理:希尔排序本质是对插入排序的改进做法,提高效率,先将待排序列进行预排序使之接近
有序 ,再进行最后排序*/
/*时间复杂度最优O(N^1.3),最差:O(N^1.3);
空间复杂度O(1)*/
/*它的代码量小,不需要使用额外的内存,而且对于中等大小的数组它的运行时间是可以接受的。
如果你需要解决一个排序问题而又没有系统的排序函数可用,可以先用希尔排序*/
#include <stdio.h>
#include <malloc.h>
void shellSort(int *a, int len); // 函数声明
int main(void)
{
int i, len, * a;
printf("请输入要排的数的个数:");
scanf("%d",&len);
a = (int *)malloc(len * sizeof(int)); // 动态定义数组
printf("请输入要排的数:\n");
for (i = 0; i < len; i++) { // 数组值的输入
scanf("%d",&a[i]);
}
shellSort(a, len); // 调用希尔排序函数
printf("希尔升序排列后结果为:\n");
for (i = 0; i < len; i++) { // 排序后的结果的输出
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
void shellSort(int *a, int len)
{
int i, j, k, tmp, gap; // gap 为步长
for (gap = len / 2; gap > 0; gap /= 2) { // 步长初始化为数组长度的一半,每次遍历后步长减半,
for (i = 0; i < gap; ++i) { // 变量 i 为每次分组的第一个元素下标
for (j = i + gap; j < len; j += gap) { //对步长为gap的元素进行直插排序当gap为1时就是直插排序
tmp = a[j]; // 备份a[j]的值
k = j - gap; // j初始化为i的前一个元素与i相差gap长度
while (k >= 0 && a[k] > tmp) {
a[k + gap] = a[k]; // 将在a[i]前且比tmp的值大的元素向后移动一位
k -= gap;
}
a[k + gap] = tmp;
}
}
}
}

@ -0,0 +1,70 @@
/*原理:典型的牺牲空间换时间的做法。将待排的元素作为下标,记录元素出现次数,并进行
累计,最终反向填充目标数组,达成排序目的。 */
/*时间复杂度O(N);
空间复杂度O(N)*/
/*dev编译时间0.22s*/
/*应用场景:计数排序只适用于数据范围较集中的序列的排序,如年龄排序等问题。
若待排序列的数据较分散,则会造成空间浪费,
并且计数排序只适用于整型排序,不适用与浮点型排序。
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 300000000 //元素个数
#define M 100 //元素区间
//数组打印
void arr_print(int* arr)
{
int i;
for(i=0;i<N;i++)
{
printf("%3d",arr[i]);
}
printf("\n");
}
//计数排序:统计次数、依序填入
void sort_count(int* arr)
{
int i,j,k;
//统计数组中各元素出现的次数
int count[M]={0};
for(i=0;i<N;i++)
{
//双重下标之后的元素值++,计数的经典操作
count[arr[i]]++; //巧合:下标值和元素值对应
}
//依序填入数组中
k=0; //数组元素放入位置
for(i=0;i<M;i++) //外层控制元素进入
{
for(j=0;j<count[i];j++) //内层控制元素填入次数
{
arr[k++]=i; //k++自增依序填入i值
}
}
}
int main()
{
int i;
int *arr=(int*)malloc(N*sizeof(int));
time_t start,end;
srand((unsigned int)time(NULL));
for(i=0;i<N;i++)
{
arr[i]=rand()%M;
}
printf("随机数生成:\n");
//arr_print(arr);
printf("计数排序结果:\n");
start=time(NULL);
sort_count(arr);
end=time(NULL);
printf("计数排序时长:%d s\n", end-start);
//arr_print(arr);
system("pause");
return 0;
}
Loading…
Cancel
Save