实验报告
实验名称冒泡排序和快速排序
班级
学号
姓名
成绩
#include<stdio.h>
#include<stdlib.h>
#define N 20
//定义用于比较和交换计数的全局变量
static int compare, move;
int main()
{
int data1[N], data2[N];
int i;
void bubbleSort(int[20]);
void quickSort(int[20], int, int);
//创建两个相同的数组用于两种排序方法
for (i = 0; i<N; i++)
{
data1[i] = rand() % 100 + 1;
data2[i] = data1[i];
}
printf("The original array:\n");
for (i = 0; i<N; i++)
printf("%d ", data1[i]);
//调用冒泡排序法
bubbleSort(data1);
//计数器置零
compare = 0;
move = 0;
//调用快速排序法
quickSort(data2, 0, N - 1);
printf("Quicksort completed!The results are as follows:\n");
for (i = 0; i<N; i++)
printf("%d ", data2[i]);
printf("\nCompare times:%d\n", compare);
printf("Move times:%d", move);
return 0;
}
//冒泡排序法
void bubbleSort(int a[N])
{
int i, j, temp;
compare = 0;
move = 0;
//总共循环N-2轮
for (i = 0; i<N - 1; i++)
{
//每轮循环从头开始,到有序序列前结束
for (j = 0; j<N - i - 1; j++)
{
//比较交换,将较大的数放到后面
if (a[j + 1]<a[j])
{
temp = a[j + 1];
a[j + 1] = a[j];
a[j] = temp;
move++;
}
compare++;
}
}
printf("\n\nBubblesort completed!The results are as follows:\n");
for (i = 0; i<N; i++)
printf("%d ", a[i]);
printf("\nCompare times:%d\n", compare);
printf("Move times:%d\n\n", move);
}
//快速排序法
void quickSort(int a[N], int left, int right)
{
//将数组一分为二的键值
int pivotkey;
if (left < right)
{
//第一次排序将数组一分为二
pivotkey = partition(a, left, right);
//递归调用,对数据比键值小的数组排序
quickSort(a, left, pivotkey - 1);
//递归调用,对数据比键值大的数组排序
quickSort(a, pivotkey + 1, right);
}
}
//进行一次快速排序
int partition(int a[N], int left, int right)
{
int key, i, low = left, high = right;
//设置基准
key = a[low];
while (low<high)
{
//high中数据比基准大,则向前依次查找
while ((low < high) && (a[high] > key))
{
high--;
compare++;
}
//如果不是两指针相遇,说明存在需要交换到low的值
if (low < high)
{
a[low] = a[high];
move++;
}
//low中数据比基准小,则向后依次查找
while ((low < high) && (a[low] <= key))
{
low++;
compare++;
}
//如果不是两指针相遇,说明存在需要交换到high的值
if (low<high)
{
a[high] = a[low];
move++;
}
}
//首尾指针相遇后,将基准放入空位
a[low] = key;
//返回此时的键值
return low;
}
运行结果:
【结论】(结果)
1.由实验结果知,编写的冒泡排序法和快速排序法都成功的将一个无序的数组排成了一个有序数组并打印输出,说明这两种算法是可行的。
2.从记录的比较值和移动值的大小来看,冒泡排序比较了190次,即(N*N-1)/2次,交换了87次;快速排序法比较了64次,交换了27次。
可以明显的看出快速排序法的效率较高,运行速度较快。
可以猜想,当数据量进一步扩大时,快速排序法将比冒泡排序法的平均运行速度更短
【小结】
这次的实验题目是关于两种算法的。
由于在之前的c语言学习中我已经对这两种算法有了一个大致的了解,所以编写源程序及调试并不困难,最后的运行结果也是正确的。
但是,与之前的学习不同的是,在本次试验中加入了对比较和交换次数的比较。
这就涉及到了数据结构中算法的时间复杂度问题。
经过查阅资料得知,冒泡排序最好的时间复杂度为O(n) 。
若初始文件是反序的,需要进行 n-1 趟排序。
每趟排序要进行 n-i 次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。
在这种情况下,比较和移动次数均达到最
大值:。
冒泡排序的最坏时间复杂度为 O(n2) 。
综上,冒泡排序总的平均时间复杂度为 O(n2) 。
快速排序法的最坏情况运行时间为θ(n2),且最坏情况发生在每次划分过程产生的两个区间分别包含n-1个元素和1个元素的时候。
最好情况是O(nlogn),。