博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

DS-排序-0001-选择排序

Posted on 2023-10-30 22:59  乔55  阅读(4)  评论(0编辑  收藏  举报

选择排序

// 交换2数
void xxx_swap(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
}

// 选择排序1
// 1、将arr[j]依次与arr[i]比较,将较小者存放在arr[j]处
// 2、j控制外层循环,取值为0~N-1
// 3、i控制内层循环,取值从j+1~N-1
// 4、缺点:有些位置并非最小值,仍然被交换到j位置,然后又被交换到其他位置
void xxx_select_1(int arr[], int N)
{
	if (arr == NULL || N < 2)
	{
		return;
	}
	for (int j = 0; j < N; ++j)
	{
		for (int i = j + 1; i < N; ++i)
		{
			if (arr[i] < arr[j]) // 交换2者
			{
				xxx_swap(arr[i], arr[j]);
			}
		}
	}
}

// 选择排序2:从j~N-1区间内,找出最小值下标minIndex,将arr[j]与arr[minIndex]交换
// 1、用i遍历数组,i取值为j+1~N-1,minIndex记录在遍历过程中最小值的下标
// 2、将arr[minIndex]与arr[j]交换即可,j取值从0~N-1

void xxx_select_2(int arr[], int N)
{
	if (arr == NULL || N < 2)
	{
		return;
	}

	for (int j = 0; j < N; ++j)
	{
		int minIndex = j;	// 假定j位置为当前最小值位置
		for (int i = j + 1; i < N; ++i)
		{
			minIndex = (arr[i] < arr[minIndex]) ? i : minIndex;
		}
		xxx_swap(arr[minIndex], arr[j]);
	}
}

void test()
{
	int arr[] = { 3,4,2,5,6,8,1,-5,10,50 };
	int N = sizeof(arr) / sizeof(arr[0]);
	xxx_select_2(arr, N);
	for (int i = 0; i < N; ++i)
	{
		cout << arr[i] << ",";
	}
	cout << endl;
}