问题描述:
编写实验程序,随机产生10个1~20的正数,设计一个高效算法找其中的最大元素和最小元素,并统计元素之间的比较次数。调用该算法执行10次并求元素的平均比较次数。
解决方案:
一个啥都不会的菜鸟写的,走过路过求指点
随机数创建,希尔排序
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
void shellSort(int *arr, int len);//函数声明
int main(void)
{
int arr[10], i, len = 10;
srand((unsigned)time(NULL));
printf("有下列数字:");
for (i = 0; i < 10; i++)
{
arr[i] = rand()%20;
printf("%d ",arr[i]);
}//这里是产生随机数,并且存储到数组里面去
printf("\n");
shellSort(arr, len);
for(i = 0; i < len; i++){
printf("%d\t", arr[i]);
}
printf("\n");
return 0;
}
void shellSort(int *arr, int len)
{
int i, j, k, temp, gap, d = 0;//gap是步长,d是次数
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的时候就为直插排序
temp = arr[j];//备份a[j]的值
k = j - gap;//j初始化为i的前一个元素
while(k >= 0 && arr[k] > temp){
arr[k + gap] = arr[k];//将在a[i]前且比temp的值大的元素向后移动一位
k -= gap;
d++;
}
arr[k + gap] = temp;
}
}
}
printf("最小值为:%d\n", arr[0]);
printf("最大值为:%d\n", arr[9]);
printf("比较次数为:%d\n", d);
}