(九)數據結構之簡單排序算法實現:冒泡排序、插入排序和選擇排序

1、冒泡排序

/* 冒泡排序,按照由小到大順序進行排序 */
void Bubble_Sort( ElementType A[], int N )
{ 
	int P, i;
	int flag = 0;	/* 定義一個flag來判斷帶排序序列是否有序或局部有序,提高算法效率 */
	for ( P=N-1; P>=0; P-- )
	{
		flag = 0;
		for( i=0; i<P; i++ )
		{
			/* 一趟冒泡*/
			if ( A[i] > A[i+1] ) 
			{
				Swap(&A[i], &A[i+1]);
				flag = 1; /* 標識發生了交換*/
			}
		}
		if ( flag==0 ) break; /* 全程無交換*/
	}
}

2、插入排序

/* 插入排序,從小到大排序, */
void Insertion_Sort( ElementType A[], int N )
{ 
	int i, P;
	ElementType Tmp;
	for ( P=1; P<N; P++ ) 
	{
		Tmp = A[P]; 				/* 從第二個元素開始插入*/
		for ( i=P; i>0 && A[i-1]>Tmp; i-- )
			A[i] = A[i-1]; 			/* 移出空位*/
		A[i] = Tmp; 				/* 把後續數據插入到合適的位置上去*/
	}
}

3、選擇排序

/* 選擇排序 */
void Selection_Sort ( ElementType A[], int N )
{
	int i, j, k;
	ElementType Tmp;
	for(i = 0; i < N; i++)
	{
		Tmp = A[i];
		k = i;
		for(j = i + 1; j < N; j++)
		{
			if(Tmp > A[j])  /* 找到剩下元素中最小的元素對應的下標 */
			{
				 k = j; 
				 Tmp = A[j];
			}
		}
		if(k != i)		// 表示當前位置和最小元素所在位置不相同
			Swap(&A[i], &A[k]);
	}
}

4、完整示例代碼

4.1 冒泡排序和插入排序

/* 簡單排序算法的基本實現 */
#include <stdio.h>

/* 定義一些輔助數據結構或者類型 */
typedef int ElementType;

/* 定義一個用於交換的函數 */
void Swap(ElementType *a, ElementType *b)
{
	ElementType temp;z
	temp = *a;
	*a = *b;
	*b = temp;
}

/* 冒泡排序,按照由小到大順序進行排序 */
void Bubble_Sort( ElementType A[], int N )
{ 
	int P, i;
	int flag = 0;	/* 定義一個flag來判斷帶排序序列是否有序或局部有序,提高算法效率 */
	for ( P=N-1; P>=0; P-- )
	{
		flag = 0;
		for( i=0; i<P; i++ )
		{
			/* 一趟冒泡*/
			if ( A[i] > A[i+1] ) 
			{
				Swap(&A[i], &A[i+1]);
				flag = 1; /* 標識發生了交換*/
			}
		}
		if ( flag==0 ) break; /* 全程無交換*/
	}
}

/* 插入排序,從小到大排序, */
void Insertion_Sort( ElementType A[], int N )
{ 
	int i, P;
	ElementType Tmp;
	for ( P=1; P<N; P++ ) 
	{
		Tmp = A[P]; 				/* 從第二個元素開始插入*/
		for ( i=P; i>0 && A[i-1]>Tmp; i-- )
			A[i] = A[i-1]; 			/* 移出空位*/
		A[i] = Tmp; 				/* 把後續數據插入到合適的位置上去*/
	}
}

/* 程序入口 */
int main()
{
	int i;
	ElementType temp;
	ElementType array[10];

	printf("Input 10 numbers : ");
	for(i = 0; i < 10; i++)
	{
		scanf("%d", &temp);
		array[i] = temp;
	}

	/* 原始數據輸出 */
	printf("***********************************Origin************************************\n");
	for(i = 0; i < 10; i++)
		printf("%d ", array[i]);
	printf("\n");

	/* 冒泡排序後輸出 */
	printf("***********************************Bubble************************************\n");
	Bubble_Sort(array, sizeof(array)/sizeof(array[0]));
	for(i = 0; i < 10; i++)
		printf("%d ", array[i]);
	printf("\n");

	printf("Input 10 numbers : ");
	for(i = 0; i < 10; i++)
	{
		scanf("%d", &temp);
		array[i] = temp;
	}

	/* 原始數據輸出 */
	printf("***********************************Origin************************************\n");
	for(i = 0; i < 10; i++)
		printf("%d ", array[i]);
	printf("\n");

	/* 插入排序後輸出 */
	printf("***********************************Insertion*********************************\n");
	Insertion_Sort(array, sizeof(array)/sizeof(array[0]));
	for(i = 0; i < 10; i++)
		printf("%d ", array[i]);
	printf("\n");

	return 0;
}

4.2 選擇排序

#include <stdio.h>

/* 定義一些輔助數據結構或者類型 */
typedef int ElementType;

/* 定義一個用於交換的函數 */
void Swap(ElementType *a, ElementType *b)
{
	ElementType temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

/* 選擇排序 */
void Selection_Sort ( ElementType A[], int N )
{
	int i, j, k;
	ElementType Tmp;
	for(i = 0; i < N; i++)
	{
		Tmp = A[i];
		k = i;
		for(j = i + 1; j < N; j++)
		{
			if(Tmp > A[j])  /* 找到剩下元素中最小的元素對應的下標 */
			{
				 k = j; 
				 Tmp = A[j];
			}
		}
		if(k != i)		// 表示當前位置和最小元素所在位置不相同
			Swap(&A[i], &A[k]);
	}
}


/* 程序入口 */
int main()
{
	
	int i;
	ElementType temp;
	ElementType array[10];

	printf("Input 10 numbers : ");
	for(i = 0; i < 10; i++)
	{
		scanf("%d", &temp);
		array[i] = temp;
	}

	/* 原始數據輸出 */
	printf("***********************************Origin************************************\n");
	for(i = 0; i < 10; i++)
		printf("%d ", array[i]);
	printf("\n");

	/* 選擇排序後輸出 */
	printf("***********************************Selection*********************************\n");
	Selection_Sort(array, sizeof(array)/sizeof(array[0]));
	for(i = 0; i < 10; i++)
		printf("%d ", array[i]);
	printf("\n");

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