冒泡排序法、選擇排序法和插入排序法的排序過程


1.       冒泡排序法:n個數從小到大排序,經過n-1趟循環,每次循環中兩兩比較相鄰兩個數的大小,前者大於後者則將兩數交換,直到最後一個,每次通過不斷交換相鄰兩數將未排序中的最大的那個數交換到排序中的最前一位。


2.       選擇排序法:n個數從小到大排序,先將第一個數認爲最小的數,經過n-1趟循環,每次循環中將認爲最小的數與下一個數比較,如果大於則交換這兩數,直到最後一個,每次找出未排序中最小的值排在排序中的最後一位。


3.       插入排序法:將n個數看成n張撲克牌,默認手裏拿到的第一張牌爲最小值,接着每次拿起一張牌都與前面的第一張牌比較,大於則放在最後即可,小於則與前面的交換,繼續跟前面的牌比較,直到大於前面的牌爲止。


以上三種排序方法是簡單常見,但是效率都很低的排序方法,高效的排序法有快速排序法等,以下程序僅在說明排序方法,重在容易理解,不重效率,實際運用時每種方法都有很大的優化空間。

/* 冒泡法排序 */
void sort_1(int dat[],int n)
{
	int i,j;
	int temp;
	for(i=0;i<n-1;i++)
	{
		for(j=0;j<n-1;j++)
		{
			if(dat[j]>dat[j+1])
			{
				temp=dat[j];
				dat[j]=dat[j+1];
				dat[j+1]=temp;
			}
		}
		/* 以下{ }裏內容只是爲了打印出排序過程 */
		{
			int timer;
			printf("\n冒泡法排序第%d步結果:\t",i+1);
			for(timer=0;timer<n;timer++)
				printf("%3d ",dat[timer]);
		}
	}
}
/* 選擇法排序 */
void sort_2(int dat[],int n)
{
	int i,j,min;
	int temp;
	for(i=0;i<n-1;i++)
	{
		min=i;
		for(j=i+1;j<n;j++)			
		{
			if(dat[j]<dat[min])
				min=j;
		}
		if(min!=i)
		{
			temp=dat[i];
			dat[i]=dat[min];
			dat[min]=temp;
		}
		/* 以下{ }裏內容只是爲了打印出排序過程 */
		{
			int timer;
			printf("\n選擇法排序第%d步結果:\t",i+1);
			for(timer=0;timer<n;timer++)
				printf("%3d ",dat[timer]);
		}
	}
}
/* 插入排序法 */
void InsertSort(int dat[],int n)
{	 
	int i,j;
	int temp;
	for(i=1;i<n;i++)
	{
		temp=dat[i];
		for(j=i;j>0&&dat[j-1]>temp;j--)
		{
			dat[j]=dat[j-1];
		}
		dat[j]=temp;

		/* 以下{ }裏內容只是爲了打印出排序過程 */
		{
			int timer;
			printf("\n插入法排序第%d步結果:\t",i+1);
			for(timer=0;timer<n;timer++)
				printf("%3d ",dat[timer]);
		}

	}
}

#include <stdio.h>
#include <stdlib.h>

#define random(x) (rand()%(x))
#define NUM_MAX	10

/* 主函數 */
void main(void)
{	
	int i;
	int buf[NUM_MAX];

	printf("\n原始數據:\t\t");
	for(i=0;i<NUM_MAX;i++)
	{
		buf[i]=random(1000);
		printf("%3d ",buf[i]);
	}
	printf("\n");

	sort_3(buf,NUM_MAX);

	printf("\n\n排序後數據:\t\t");
	for(i=0;i<NUM_MAX;i++)
	{
		printf("%3d ",buf[i]);
	}
	printf("\n");
}
運行結果如下:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章