溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

常見排序算法之選擇排序

發(fā)布時間:2020-07-27 21:02:05 來源:網(wǎng)絡 閱讀:409 作者:duanjiatao 欄目:編程語言

常見排序算法之選擇排序

常見排序算法之選擇排序

1.直接選擇排序

直接選擇排序和直接插入排序類似,都將數(shù)據(jù)分為有序區(qū)和無序區(qū),所不同的是直接插入排序是將無序區(qū)的第一個元素直接插入到有序區(qū)以形成一個更大的有序區(qū),而直接選擇排序是從無序區(qū)選一個最小的元素直接放到有序區(qū)的最后。

設數(shù)組為a[0…n-1]。

1.      初始時,數(shù)組全為無序區(qū)為a[0..n-1]。令i=0

2.      在無序區(qū)a[i…n-1]中選取一個最小的元素,將其與a[i]交換。交換之后a[0…i]就形成了一個有序區(qū)。

3.      i++并重復第二步直到i==n-1。排序完成

這里直接給出一種比較優(yōu)化的直接選擇排序,每次遍歷選出最大值和最小值

void SelectSort(int* a, size_t n)  //選擇排序優(yōu)化版
{
	assert(a);

	for (int left = 0, right = n - 1; left < right; ++left, --right)
	{
		int min = left;
		int max = right;

		for (int i = left; i <= right; ++i)
		{
			if (a[i] < a[min])
				min = i;
			else if (a[i] > a[max])
				max = i;
		}

		if (min != left)
		{
			std::swap(a[min], a[left]);

			if (max == left)
			{
				max = min;
			}
		}
		if (max != right)
		{
			std::swap(a[max], a[right]);
		}

	}
}

2.堆排序

將待排序的數(shù)組建立一個大堆,每次將堆頂?shù)脑厝〕龇旁跀?shù)組的最后一個位置上,再對數(shù)組的長度減1,然后對堆進行調(diào)整,使之仍然是一個大堆,直到堆的長度為1,將此元素放在數(shù)組的起始位置,排序完成。

void AdjustDown(int* a, size_t size, size_t root)
{
	assert(a);

	int child = root * 2 + 1;
	while (child < size)
	{
		if (child+1 < size && a[child + 1] > a[child])
		{
			++child;
		}
		if (a[child] > a[root])
		{
			std::swap(a[child], a[root]);
			root = child;
			child = root * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

void HeapSort(int* a, size_t n)
{
	assert(a);
	for (int i = (n-2)/2; i >=0 ; --i)
	{
		AdjustDown(a, n, i);  //建(大)堆
	}

	for (int i = n - 1; i > 0; --i)  //這樣寫比較好
	{
		std::swap(a[0], a[i]);
		AdjustDown(a, i - 1, 0);
	}

}

常見排序算法之選擇排序常見排序算法之選擇排序常見排序算法之選擇排序常見排序算法之選擇排序常見排序算法之選擇排序常見排序算法之選擇排序常見排序算法之選擇排序常見排序算法之選擇排序常見排序算法之選擇排序常見排序算法之選擇排序常見排序算法之選擇排序

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI