1. 程式人生 > >從右向左氣泡排序

從右向左氣泡排序

 前面寫的氣泡排序是從左邊向右找較大值,先找到最大值,然後依次找到次最大值,從右往左排序。這篇文章再次從右邊往左找最小值,先將最小值找到,再找次較小值,從左往右排序。

我們先定義三個值int size=sizeof(arr)/sizeof(arr[0]);//陣列的大小

int cur;//current 當前值

int bound;//邊界(0,size-1]就可以表示整個陣列下標的區間,(0,bound]表示已排序的區間,[bound,size)表示待排序區間

定義一個排序的函式,程式碼如下所示

void asc_sorted(int* arr,int size)
{
	int bound; int cur;//cur:current,bound :邊界
	for (bound = 0; bound<size; ++bound)
	{
		for (cur = size - 1; cur>bound;--cur)
		{
			//找較小值
			if (arr[cur - 1] > arr[cur])
			{
				int temp = arr[cur];
				arr[cur] = arr[cur - 1];
				arr[cur - 1] = temp;
			}
		}
	}
}

// 陣列作為函式的引數時會隱式轉換成指標,指向陣列的首元素,所以在定義時要借用指標。
// 在函式外部將陣列長度求好然後當做引數傳到函式裡面。

完整程式如下所示示。程式碼中只要求對5 個數進行排序,如果需要更多,修改陣列大小就行。

#include <stdio.h>
#include <stdlib.h>
void asc_sorted(int* arr,int size)//ascending升序,desending降序
{
	int bound; int cur;//cur:current,bound :邊界
	for (bound = 0; bound<size; ++bound)
	{
		for (cur = size - 1; cur>bound;--cur)
		{
			//找較小值
			if (arr[cur - 1] > arr[cur])
			{
				int temp = arr[cur];
				arr[cur] = arr[cur - 1];
				arr[cur - 1] = temp;
			}
		}
	}
}

int main()
{
	// 陣列作為函式的引數時會隱式轉換成指標,指向陣列的首元素
	// 在函式外部將陣列長度求好然後當做引數傳到函式裡面
	int arr[5];
	int size = sizeof(arr) / sizeof(arr[0]);
	printf("please enter the array:\n");
	for (int i = 0; i < 5; i++)
		scanf_s("%d", &arr[i]);
	asc_sorted(&arr,size);
	for (int i = 0; i < 5; i++)
		printf ("%d\t", arr[i]);
	system("pause");
	return 0;
}