实验8 排序和查找

目录


实验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右边
       
    }
}

结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特辣番茄炒鸡蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值