目录
实验8 排序和查找
一、【实验目的】
(1)掌握主要的排序算法:插入排序,快速排序,归并排序等。
(2)理解不同排序算法的时间复杂度,观察在不同排列数据下排序算法的比较次数,排序规则为升序(最小到大)。
二、【实验内容】
使用快速排序、冒泡排序算法完成对下列三组数据的排序,计算对每组数据排序时的比较次数。三组示例数据如下(每组数据包含20个元素):
list1[] = {98, 84, 77, 65, 62, 54, 50, 48, 43, 37, 35, 33, 29, 26, 25, 18, 12, 10, 8, 3}
list2[] = {3, 8, 10, 12, 18, 25, 26, 29, 33, 35, 37, 43, 48, 50, 54, 62, 65, 77, 84, 98}
list3[] = {37, 3, 8, 10, 62, 12, 98, 35, 84, 18, 65, 54, 43, 29, 77, 25, 33, 48, 26, 50}
分析两种排序算法在每组数据上的比较次数呈现变化的原因,将分析与总结写在实验报告第五部分。
对排序以后的序列进行二分查找,记录查找关键字为95和关键字为12需要经过的数据比较次数。
Main.c
#include <stdio.h>
#include "paixu.h"
extern int sum2;
void dispList(int arr[],int n)
{
int i;
for(i = 0;i < n;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int i,j;
int resultNum[10];
int list1[20] = {98, 84, 77, 65, 62, 54, 50, 48, 43, 37, 35, 33, 29, 26, 25, 18, 12, 10, 8, 3};
int list2[20] = {3, 8, 10, 12, 18, 25, 26, 29, 33, 35, 37, 43, 48, 50, 54, 62, 65, 77, 84, 98};
int list3[20] = {37, 3, 8, 10, 62, 12, 98, 35, 84, 18, 65, 54, 43, 29, 77, 25, 33, 48, 26, 50};
resultNum[0] = BubbleSort(list1,20);
printf("第一组冒泡排序后的数据:");
dispList(list1,20);
printf("比较次数为%d \n",resultNum[0]);
QuickSort(list1,0,19);
resultNum[1] = sum2;
printf("第一组快速排序后的数据:");
dispList(list1,20);
printf("比较次数为%d \n",resultNum[1]);
resultNum[2] = BubbleSort(list2,20);
sum2 = 0;
printf("第二组冒泡排序后的数据:");
dispList(list2,20);
printf("比较次数为%d \n",resultNum[2]);
QuickSort(list2,0,19);
resultNum[3] = sum2;
printf("第二组快速排序后的数据:");
dispList(list2,20);
printf("比较次数为%d \n",resultNum[3]);
sum2 = 0;
resultNum[4] = BubbleSort(list3,20);
printf("第三组冒泡排序后的数据:");
dispList(list3,20);
printf("比较次数为%d \n",resultNum[4]);
QuickSort(list3,0,19);
resultNum[5] = sum2;
printf("第三组快速排序后的数据:");
dispList(list3,20);
printf("比较次数为%d \n",resultNum[5]);
printf("二分查找12的比较次数:");
resultNum[6] = BinarySearch(list1,20,12);
if(resultNum[7] == -1)
printf("该数据在数组中找不到\n");
else
printf("该数据在数组的第%d位 \n",resultNum[6]);
printf("二分查找95的比较次数:");
resultNum[7] = BinarySearch(list1,20,95);
if(resultNum[7] == -1)
printf("该数据在数组中找不到\n");
else
printf("该数据在数组的第%d位 \n",resultNum[7]);
}
Paixu.h
#include <stdio.h>
#define MaxSize 100
int sum2 = 0;
int BinarySearch(int list[],int n,int x) //二分查找
{
int sum = 0;
int low = 0;
int hight = n - 1;
int mid;
while(low <= hight)
{
mid = (low + hight) / 2;
if(list[mid] == x)
{
printf("%d \n",sum);
return mid + 1;
}
else if(list[mid] > x)
hight = mid - 1;
else
low = mid + 1;
sum++;
}
printf("%d \n",sum);
return -1;
}
int BubbleSort(int a[],int n) //冒泡排序 升序
{
int i,j;
int temp;
int sum1 = 0;
for(i = 1;i < n;i++)
{
for(j = 0;j < n - i;j++)
{
sum1++;
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
return sum1;
}
void QuickSort(int *arr, int low, int high)
{
if (low < high)
{
int i = low;
int j = high;
int k = arr[low];
while (i < j)
{
while(i < j && arr[j] >= k) // 从右向左找第一个小于k的数
{
j--;
sum2++;
}
if(i < j)
{
arr[i++] = arr[j];
}
while(i < j && arr[i] < k) // 从左向右找第一个大于等于k的数
{
i++;
sum2++;
}
if(i < j)
{
arr[j--] = arr[i];
}
}
arr[i] = k;
// 递归调用
QuickSort(arr, low, i - 1); // 排序k左边
QuickSort(arr, i + 1, high); // 排序k右边
}
}