实验十二 排序
1、实验目的:
理解常见的排序算法。
2、实验环境与设备:
已安装Visual Studio 2010(或其以上版本)集成开发环境的计算机。
3、实验原理:
常见排序算法的排序思想及其实现。
4、实验内容:
设计相应算法,分别统计直接插入排序、起泡排序、简单选择排序3种排序算法执行过程中需要进行的关键字比较和记录移动次数。注:上述算法实现时可以把元素类型均简化为int型。如待排序列为:
{49,38,65,97,76,13,27,49}
(另外3种排序算法:希尔排序、快速、归并排序的比较和移动次数统计作为选作内容。)。
5、实验考核:
(1)完成纸质版实验报告
(2)提交电子版作业
6、执行结果示例如下:
源代码
#include<stdio.h>
//#include<stdlib.h>
int count = 0;
void swap(int *a, int *b)
{
count++;
int tempt = *a;
*a = *b;
*b = tempt;
}
方法3.插入排序
int InsertionSort(int *arr, int n)
{
int PreIndex, current, i, j, num;
num = 0;
for (i = 1; i < n; i++)
{
num++;
if (arr[i] < arr[i - 1])
{
int tempt = arr[i];
for (j = i - 1; j >= 0 && arr[j] > tempt; j--)
{
num++; count++;
arr[j + 1] = arr[j];
}
arr[j + 1] = tempt;
count += 2;
}
if (i >= 1) {
printf("第 i = %d 趟排序后:", i + 1);
for (j = 0; j < n; j++)printf("%d ", arr[j]);
puts("");
}
}
return num;
}
方法1.冒泡排序
int BubbleSort(int *arr, int n)
{
int i, j, num, k;
num = 0;
for (i = n - 1; i > 1; i--)
{
for (j = 0; j < i; j++) {
num++;
if (arr[j] > arr[j + 1])
{
swap(&arr[j], &arr[j + 1]);
}
}
printf("第 i = %d 趟排序后:", n - i);
for (k = 0; k < n; k++)printf("%d ", arr[k]);
puts("");
}
return num;
}
方法2.选择排序
int SelectionSort(int *arr, int n)
{
int MinIndex, i, j, num, k;
num = 0;
for (i = 0; i < n - 1; i++)
{
MinIndex = i;
for (j = i + 1; j < n; j++) {
num++;
if (arr[j] < arr[MinIndex])MinIndex = j;
}
swap(&arr[i], &arr[MinIndex]);
printf("第 i = %d 趟排序后:", i + 1);
for (k = 0; k < n; k++)printf("%d ", arr[k]);
puts("");
}
return num;
}
void PlayInsertSort(int *arr, int len)
{
int i;
printf("直接插入排序:\n");
int num = InsertionSort(arr, len);
printf("排序后:");
for (i = 0; i < len; i++)printf("%d ", arr[i]);
puts("");
printf("比较次数:%d,移动次数:%d\n", num, count);//count为全局变量
}
void PlayBubbleSort(int *arr, int len)
{
int i;
printf("起泡排序:\n");
int num = BubbleSort(arr, len);
printf("排序后:");
for (i = 0; i < len; i++)printf("%d ", arr[i]);
puts("");
printf("比较次数:%d,移动次数:%d\n", num, count * 3); //count为全局变量,记得乘三
}
void PlaySelectionSort(int *arr, int len)
{
int i;
printf("选择排序:\n");
int num = SelectionSort(arr, len);
printf("排序后:");
for (i = 0; i < len; i++)printf("%d ", arr[i]);
puts("");
printf("比较次数:%d,移动次数:%d\n", num, count * 3);
}
int main()
{
int i;
int arr[] = { 49, 38, 65, 97, 76, 13, 27, 49 };
int len = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < len; i++)printf("%d ", arr[i]);
puts("");
PlayInsertSort(arr, len);
count = 0;
printf("*********************************************\n");
int arr1[] = { 49, 38, 65, 97, 76, 13, 27, 49 };
PlayBubbleSort(arr1, len);
count = 0;
printf("*********************************************\n");
int arr2[] = { 49, 38, 65, 97, 76, 13, 27, 49 };
PlaySelectionSort(arr2, len);
system("pause");
return 0;
}