三种简单的排序——冒泡 选择 插入

冒泡排序:是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过                        来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为                    越小的元素会经由交换慢慢“浮”到数列的顶端。 

选择排序:是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始                   位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元                   素均排序完毕。

插入排序:是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,                   找到相应位置并插入。插入排序在实现上,通常采用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);
		}

	}	
}
    















猜你喜欢

转载自blog.csdn.net/Neptune__/article/details/81530728
今日推荐