冒泡排序:是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过 来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为 越小的元素会经由交换慢慢“浮”到数列的顶端。
选择排序:是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始 位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元 素均排序完毕。
插入排序:是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描, 找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从 后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
#include <stdio.h>
#define MAX 10
typedef int Elementype;//类型转换
typedef Elementype Arr[MAX];//定义一个整数型数组
void print(Arr arr);
void bubble(Arr arr);
void select(Arr arr);
void insert(Arr arr);
void swap(Arr arr,Elementype i,Elementype j)//swap函数用来将数组arr中元素i与j的值互换
{
int temp = 0;
if(arr[i] > arr[j])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int main()
{
Arr arr = {8,5,4,6,7,1,2,3,9,0};//设置一个数组
print(arr);//打印这个数组
bubble(arr);//调用函数bubble
select(arr);//调用函数select
insert(arr);//调用函数insert
}
void print(Arr arr)//打印函数
{
int i;
for(i = 0;i < MAX;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void bubble(Arr arr)//冒泡排序
{
int i,j;
int flag;
for(i = 0;i < MAX -1;i++)//i小于MAX-1因为当for循环循环9次后只剩一位没有排序,而这位数必定是最小的(大的数经过排序都在它后面),所以这次循环可省略
{
flag = 0;//定义flag作用是当循环没结束但排序已完成后直接打印,如果没有flag将重复打印已完成的数列(浪费资源)
for(j = 0;j < MAX - i - 1;j++)//循环一次后最大的数将放在最后一位,所以下次循环最后一位将不参与排序因此-i,-1同上
{
if(arr[j] > arr[j+1] )
{
swap(arr,j,j+1);//调用swap函数
flag = 1;
}
}
if(flag == 0)
break;
print(arr);
}
}
void select(Arr arr)//选择排序
{
int i,j;
int min;
for(i = 0;i < MAX -1;i++)
{
min = i;//定义一个min代替i进入下一个循环,i值不改变
for(j = i+1;j < MAX;j++)
{
if(arr[min] > arr[j])
{
min = j;//arr min遇到更小的值,将那个值付给min,直到遍历整个数组找出最小的值
}
}
if(min != i)
swap(arr,i,min);//将找到的最小的值与第0个元素调换,也就是将最小的数依次放到前面
print(arr);
}
}
void insert(Arr arr)//插入排序
{
int i,j;
for(i = 1;i < MAX;i++)
{
if(arr[i-1] > arr[i])
{
Elementype temp = arr[i];//赋值为了使接下来的循环不受影响
for(j = i-1;j >= 0;j--)//小的数一次与前面的值进行比较所以要--
{
if(temp < arr[j])
{
arr[j+1] = arr[j];//如果后面的数小于前面的数,将前面的数值赋值给它后面的那个数
}
else
break;
}
arr[j+1] = temp;//这里j要加1,因为for循环结束后j还要进行一次j--,就相当与将后面的值插入到前面
print(arr);
}
}
}