实验名称
实验二 排序问题程序设计
实验目的
(1)掌握选择排序和起泡排序的基本思想;
(2)掌握两种排序方法的具体实现过程;
(3)在掌握的基础上编程实现两种排序方法。
实验题目
输入一个待排序的序列,分别用选择排序和起泡排序两种排序方法将其变换成有序的序列,输出结果,输出时要求有文字说明。请任选一种语言编写程序实现上述算法,并分析其算法复杂度。
实验源代码
#include <stdio.h>
#include <stdlib.h>
void SelectSort(int a[], int n){//选择排序
int i,j,k,temp;
for(i=0; i<n-1; i++){
k = i;
for(j=i+1; j<n; j++)
if(a[j]<a[k]){
k = j;
}
if(k != i){
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
}
void BubbleSort(int a[], int n){//起泡排序
int i,j,temp,k=0;
for(i=0; i<n-1; i++){
for(j=1; j<n-i; j++){
if(a[j] < a[j-1]){
k++;
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
}
if(k == 0) break;//如果本身是有序数列则直接退出
}
}
int main(){
int num,*p=0,i;
printf("输入数组元素个数:");
scanf("%d",&num);
p = (int *)malloc(sizeof(int)*num);
printf("请输入%d个数组元素:",num);
for(i=0;i<num;i++)
{
scanf("%d",&p[i]);
}
printf("\n排序前:\n");
for(i=0;i<num;i++)
{
printf("%d ",p[i]);
}
SelectSort(p,num);//选择排序
BubbleSort(p,num);//起泡排序
printf("\n排序后:\n");
for(i=0;i<num;i++)
{
printf("%d ",p[i]);
}
}
实验结果
选择排序:
起泡排序:
空间复杂度:
选择排序和冒泡排序的空间复杂度都是O(1),因为只是用了2个循环变量以及1到2个标志和交换等的中间变量 时间复杂度比较:
(1)选择排序:不稳定,时间复杂度 O(n^2)
选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i…n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置已经是正确的了。
(2)起泡排序:稳定,时间复杂度 O(n^2)
起泡排序方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。而如果检查一遍发现所有的元素顺序正确的话,直接可以结束排序并输出。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在做第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。