国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn))

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序

????????????????
????????????????
????????????????????????????????
????????????????????????????????
???? 追風(fēng)趕月莫停留 ????
????????????????????????????????
???? 平蕪盡處是春山????
????????????????????????????????
????????????????????????????????
????????????????
????????????????

??插入排序

??直接插入排序

#include<stdio.h>
/// 直接插入排序
void InsertSort(int* a, int n)
{
	for (int i = 0; i < n - 2; i++)
	{
		int end = i;
		int cur = a[end + 1];
		while (cur >= 0)
		{
			if (cur < a[end])
			{
				a[end + 1] = a[end];
			}
			else
			{
				break;
			}
			end--;
		}
		a[end + 1] = cur;
	}
}

int main()
{
	int a[] = { 2,66,34,5,123,34,345,456 };
	int size = sizeof(a) / sizeof(a[0]);
	InsertSort(a, size);
	for (int i = 0; i < size; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

0到end有序,把end+1序列插入到前序序列
控制[end + 1]序列有序

直接插入排序有點(diǎn)類似尾插,都是從后面開(kāi)始往前比較,和我們平常打撲克洗牌類似。

??希爾排序

void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;//保證了gap最小為1
		for (int i = 0; i < n - gap; i = i + gap)
		{
			int end = i;
			int cur = a[end + gap];
			while (end >= 0)
			{
				if (cur < a[end])
				{
					a[end + gap] = a[end];
				}
				else
				{
					break;
				}
				end = end - gap;
			}
			a[end + gap] = cur;
		}
	}
}

int main()
{
	int a[] = { 2,66,34,5,123,34,345,456 };
	int size = sizeof(a) / sizeof(a[0]);
	ShellSort(a, size);
	for (int i = 0; i < size; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序

該排序就是:預(yù)排序加直接插入排序

gap的作用就是分成多少組,一組一組的排

預(yù)排序的作用就是讓大的數(shù)更快的到后面去,而小的數(shù)更快的到前面來(lái)
在這里gap等于1的時(shí)候就是直接插入排序

??選擇排序

??選擇排序

void Swap(int* a1, int* a2)
{
	int cur = *a1;
	*a1 = *a2;
	*a2 = cur;
}
void SelectSort(int* a, int n)
{
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{
		int max = begin;
		int min = begin;
		for (int i = begin+1; i <= end; i++)
		{
			if (a[i] < a[min])
			{
				min = i;
			}
			if (a[i] > a[max])
			{
				max = i;
			}
		}
		Swap(&a[begin], &a[min]);
		if (max == begin)//特殊情況
		{
			max = min;
		}
		Swap(&a[max], &a[end]);
		begin++;
		end--;
	}
}

int main()
{
	int a[] = { 2,66,34,5,123,34,345,456 };
	int size = sizeof(a) / sizeof(a[0]);
	SelectSort(a, size);
	Print(a, size);

	return 0;
}

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序

圖里就簡(jiǎn)單列出了三步,幫大家理清程序的邏輯。

選擇排序就是從一堆數(shù)里選出最大和最小,然后最大的放在最右邊,最小的放在最左邊,然后在有效的數(shù)據(jù)長(zhǎng)度里不斷執(zhí)行這一步就可以了。

然而還有一種特殊情況:

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序
在圖中,最大的數(shù)恰好是在begin位置上,我們程序上是先把最小的放到最左邊,此時(shí)a[min]和a[begin]就會(huì)互換位置,如下:

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序

此時(shí)max上的數(shù)已經(jīng)不是最大的了,接下來(lái)再把最大的數(shù)放在最右邊,就出錯(cuò)了,所以在這里我們就需要加一個(gè)判斷:

if (max == begin)//特殊情況
		{
			max = min;
		}

大家可能還有疑問(wèn),我們這里的執(zhí)行順序是先把最小的數(shù)放在最左邊,然后把最大的數(shù)放在最右邊。

有的人肯定就會(huì)問(wèn)如果先執(zhí)行把最大的數(shù)放在最右邊,再執(zhí)行把最小的數(shù)放在最左邊,這樣是不是就不會(huì)出現(xiàn)這種特殊情況了。

但我想說(shuō)的是,如果此時(shí)最小的數(shù)恰好在end上呢,兩種都是特殊的情況,而且類似。

??堆排序

此處排序請(qǐng)看上篇博客:堆和二叉樹(shù)的動(dòng)態(tài)實(shí)現(xiàn)(C語(yǔ)言實(shí)現(xiàn)),這篇博客詳細(xì)的介紹了堆排序。

??交換排序

??冒泡排序

void Swap(int* a1, int* a2)
{
	int cur = *a1;
	*a1 = *a2;
	*a2 = cur;
}

void BuddleSort(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n - i - 1; j++)
		{
			if (a[j] > a[j + 1])
			{
				Swap(&a[j], &a[j + 1]);
			}
		}
	}
}

int main()
{
	int a[] = { 2,66,34,5,123,34,345,456 };
	int size = sizeof(a) / sizeof(a[0]);
	BuddleSort(a, size);
	for (int i = 0; i < size; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

冒泡排序大家應(yīng)該熟悉,這個(gè)排序就是兩個(gè)兩個(gè)的比較,從第一個(gè)一直比到后面。這個(gè)冒泡排序是最基礎(chǔ)的排序。

??快速排序

??快排(經(jīng)典寫(xiě)法)

void Swap(int* a1, int* a2)
{
	int cur = *a1;
	*a1 = *a2;
	*a2 = cur;
}
int PartSort1(int* a, int left, int right)//單趟
{
	int key = left;
	while (left < right)
	{
		while (left < right && a[right] >= a[key])
		{
			right--;
		}
		while (left < right && a[left] <= a[key])
		{
			left++;
		}
		Swap(&a[left], &a[right]);
	}
	Swap(&a[left], &a[key]);
	return left;
}

void QuickSort1(int* a, int left, int right)
{
	if (left >= right)
		return;
	int key = PartSort1(a, left, right);
	QuickSort1(a, left, key - 1);
	QuickSort1(a, key + 1, right);
}

int main()
{
	int a[] = { 2,66,34,5,123,34,345,456 };
	int size = sizeof(a) / sizeof(a[0]);
	QuickSort1(a, 0, size - 1);
	Print(a, size);

	return 0;
}

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序
上圖中就是單趟的走法。

在單趟走法中有幾個(gè)坑:
(1)第一個(gè)坑就是在第一個(gè)while循環(huán)中有l(wèi)eft<right了有的人就認(rèn)為在while程序內(nèi)部就會(huì)一直維持left<right,其實(shí)是錯(cuò)的。在單趟的走法中,無(wú)論是right往右走,還是left往左走,都有可能left>right發(fā)生。
(2)第二個(gè)坑就是在判斷條件a[key]>=a[right]或者a[key]<=a[left]中,等號(hào)可不可以去掉。在這里可以肯定的是這個(gè)等號(hào)是不可以去掉的,去掉的話會(huì)陷入無(wú)限循環(huán)中。

在這個(gè)排序中,我們還是利用了二叉樹(shù)的知識(shí)點(diǎn),先從左子樹(shù)排序,然后再是右子樹(shù),當(dāng)然基礎(chǔ)都是利用了遞歸。

如果有需要了解二叉樹(shù)的知識(shí)可以查看這篇博客:堆和二叉樹(shù)的動(dòng)態(tài)實(shí)現(xiàn)(C語(yǔ)言實(shí)現(xiàn)),這篇博客詳細(xì)的介紹了堆排序。

??快排(挖坑法)

int PartSort2(int* a, int left, int right)
{
	int key = a[left];
	int hold = left;
	while (left < right)
	{
		//找小
		while (left < right && a[right] >= key)
		{
			right--;
		}
		a[hold] = a[right];
		hold = right;
		//找大
		while (left < right && a[left] <= key)
		{
			left++;
		}
		a[hold] = a[left];
		hold = left;
	}
	a[hold] = key;
	return hold;
}


void QuickSort2(int* a, int left, int right)
{
	if (left >= right)
		return;
	int key = PartSort2(a, left, right);
	QuickSort2(a, left, key - 1);
	QuickSort2(a, key + 1, right);
}

int main()
{
	int a[] = { 2,66,34,5,123,34,345,456 };
	int size = sizeof(a) / sizeof(a[0]);
	QuickSort1(a, 0, size - 1);
	Print(a, size);

	return 0;
}

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序
快排(挖坑法)這是比較好理解。其中需要注意的和上面的差不多。

??快排(雙指針?lè)ǎ?/h4>
void Swap(int* a1, int* a2)
{
	int cur = *a1;
	*a1 = *a2;
	*a2 = cur;
}
int PartSort3(int* a, int left, int right)
{
	int key = left;
	int cur = left + 1;
	int old = left;
	while (cur <= right)
	{
		if (a[cur] <= a[key])
		{
			old++;
			Swap(&a[old], &a[cur]);
		}
		cur++;
	}
	Swap(&a[key], &a[old]);
	return old;
}

void QuickSort3(int* a, int left, int right)
{
	if (left >= right)
		return;
	int key = PartSort3(a, left, right);
	QuickSort3(a, left, key - 1);
	QuickSort3(a, key + 1, right);
}

int main()
{
	int a[] = { 2,66,34,5,123,34,345,456 };
	int size = sizeof(a) / sizeof(a[0]);
	QuickSort3(a, 0, size - 1);
	Print(a, size);

	return 0;
}

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序
這個(gè)雙指針寫(xiě)法,明顯比上面的兩種都好理解,代碼也簡(jiǎn)單些。這個(gè)想法還是如果a[cur]比key大,就光cur++。如果a[cur]比key小,就先old++,再把a(bǔ)[cur]賦給a[old],然后cur++。整體的思路就是這些。

??快排優(yōu)化

上面我們介紹了三種快排的寫(xiě)法,其中我們?cè)谌ey值的時(shí)候都是取left,left一開(kāi)始都是代表最左邊的數(shù)據(jù),而在現(xiàn)實(shí),left代表的值的大小不一定是在中間,如果left代表的值是較小的或者是較大的那么可能對(duì)于快排相較于其它排序來(lái)說(shuō),此種情況就是快排最壞的情況,可能比堆排或則希爾排序等來(lái)說(shuō)還要慢。

所以在取key值的時(shí)候加了一個(gè)三數(shù)取中的程序:

// 三數(shù)取中
int GetMiddle(int* a, int left, int right)
{
	int mid = (left + right) / 2;
	// left mid right
	if (a[left] < a[mid])
	{
		if (a[mid] < a[right])
		{
			return mid;
		}
		else if (a[left] > a[right])  // mid是最大值
		{
			return left;
		}
		else
		{
			return right;
		}
	}
	else // a[left] > a[mid]
	{
		if (a[mid] > a[right])
		{
			return mid;
		}
		else if (a[left] < a[right]) // mid是最小
		{
			return left;
		}
		else
		{
			return right;
		}
	}
}

這個(gè)程序就是簡(jiǎn)單的取一個(gè)中間數(shù)的大小,這樣快排就不會(huì)出現(xiàn)上面所講的那種情況。

??歸并排序

??歸并排序(遞歸)

void _MergeSort(int* a, int *tem, int left, int right)
{

	//遞歸
	if (right <= left)
		return;
	int mid = (left + right) / 2;
	_MergeSort(a, tem, left, mid);
	_MergeSort(a, tem, mid+1, right);

	//歸并,拷貝到tem中
	int left1 = left, right1 = mid;
	int left2 = mid + 1, right2 = right;
	int sum = left;
	while (left1 <= right1 && left2 <= right2)
	{
		if (a[left1] < a[left2])
		{
			tem[sum++] = a[left1++];
		}
		else
		{
			tem[sum++] = a[left2++];
		}
	}

	while (left1 <= right1)
	{
		tem[sum++] = a[left1++];
	}

	while (left2 <= right2)
	{
		tem[sum++] = a[left2++];
	}

	memcpy(a + left, tem + left, (right - left + 1) * sizeof(int));

}

void MergeSort(int* a, int n)
{
	int* tem = (int*)malloc(sizeof(int) * n);
	if (tem == NULL)
	{
		perror("malloc  fail");
		return;
	}

	_MergeSort(a, tem, 0, n - 1);

	free(tem);
}

int main()
{
	int a[] = { 2,66,34,5,123,34,345,456 };
	int size = sizeof(a) / sizeof(a[0]);

	MergeSort(a, size);
	Print(a, size);
	return 0;
}

該種排序是利用遞歸實(shí)現(xiàn)的。

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序
具體的流程如上面圖中所示。大概就是分為六步,完成后在把數(shù)組拷貝回原來(lái)數(shù)組就可以了

??歸并排序(非遞歸)

void Print(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}


void MergeSortNort(int* a, int n)
{
	int* cur = (int*)malloc(n * sizeof(int));
	if (cur == NULL)
	{
		perror("malloc  fail");
		return;
	}
	int gap = 1;
	while (gap < n)
	{
		for (int i = 0; i < n; i = i + 2 * gap)
		{
			int left1 = i, right1 = i + gap - 1;
			int left2 = i + gap, right2 = i + 2 * gap - 1;
			int sum = i;
			while (left1 <= right1 && left2 <= right2)
			{
				if (a[left1] < a[left2])
				{
					cur[sum++] = a[left1++];
				}
				else
				{
					cur[sum++] = a[left2++];
				}
			}

			while (left1 <= right1)
			{
				cur[sum++] = a[left1++];
			}
			while (left2 <= right2)
			{
				cur[sum++] = a[left2++];
			}

			memcpy(a + i, cur + i, (2 * gap) * sizeof(int));
		}
		//printf("\n");
		gap = gap * 2;
	}


}

int main()
{
	int a[] = { 2,66,34,5,123,34,345,456, };
	int size = sizeof(a) / sizeof(a[0]);
	MergeSortNort(a, size);

	Print(a, size);
	return 0;
}

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序

程序的邏輯就是圖中一步一步的來(lái),和遞歸的執(zhí)行過(guò)程有些部分是相似的,就是在這里,空間的區(qū)分可能難以讓人理解,大家可以代數(shù)進(jìn)去嘗試,多憑自己的想法寫(xiě)幾遍,大致過(guò)程也就心里有數(shù)了。

大家在圖中也看到了,最后gap取的是偶數(shù),所以這個(gè)程序的前提條件就是數(shù)據(jù)只能是偶數(shù)次的數(shù)據(jù),而一旦是奇數(shù)程序就會(huì)報(bào)錯(cuò)。接下來(lái)有一個(gè)修正版,大家可以先把偶數(shù)版的理解了,再去看奇數(shù)版的會(huì)輕松很多。

如果數(shù)據(jù)個(gè)數(shù)是偶數(shù):
數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序

這里區(qū)間一切正常,也成功排序。

如果數(shù)據(jù)個(gè)數(shù)是奇數(shù):

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序

從圖中可知,標(biāo)的有箭頭的區(qū)間劃分中,都超出范圍了,所以我們有必要修正

歸并排序優(yōu)化:

void Print(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}


void MergeSortNort(int* a, int n)
{
	int* cur = (int*)malloc(n * sizeof(int));
	if (cur == NULL)
	{
		perror("malloc  fail");
		return;
	}
	int gap = 1;
	while (gap < n)
	{
		for (int i = 0; i < n; i = i + 2 * gap)
		{
			int left1 = i, right1 = i + gap - 1;
			int left2 = i + gap, right2 = i + 2 * gap - 1;
			printf("[%d  %d]  [%d  %d]\n", left1, right1, left2, right2);
			//如果第二組不存在,這一組就不用歸并
			if (left2 >= n)
			{
				break;
			}
			//如果第二組右邊見(jiàn)越界了,就修正一下
			if (right2 >= n)
			{
				right2 = n - 1;
			}

			int sum = i;
			while (left1 <= right1 && left2 <= right2)
			{
				if (a[left1] < a[left2])
				{
					cur[sum++] = a[left1++];
				}
				else
				{
					cur[sum++] = a[left2++];
				}
			}

			while (left1 <= right1)
			{
				cur[sum++] = a[left1++];
			}
			while (left2 <= right2)
			{
				cur[sum++] = a[left2++];
			}

			memcpy(a + i, cur + i, (right2 - i + 1) * sizeof(int));
		}
		gap = gap * 2;
	}


}

int main()
{
	int a[] = { 2,66,34,5,123,34,345,456, 3};
	int size = sizeof(a) / sizeof(a[0]);
	MergeSortNort(a, size);

	Print(a, size);
	return 0;
}

修正后的程序,主要增加了2個(gè)判斷和修改了范圍。

兩個(gè)判斷:數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序
第一個(gè)判斷是防止第二組區(qū)間不存在,就直接結(jié)束,如:

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序

當(dāng)然有的人就會(huì)問(wèn),在這個(gè)圖中第一個(gè)區(qū)間的right2不是也超了嗎,為什么不要判斷right1呢?

大家可以試著想一想,如果right2超過(guò)了區(qū)間范圍,left2是不是有可能也超過(guò)了范圍。而left2超出范圍了,right1是不是一定超出了范圍。這就是一個(gè)誰(shuí)先誰(shuí)后的問(wèn)題。大家可以仔細(xì)想一想,可以代數(shù)進(jìn)去嘗試一下。而且你判斷了left2超出區(qū)間了,程序就已經(jīng)跳出循環(huán)了。

第二個(gè)判斷:

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序

就是right2超出了區(qū)間范圍,而left2沒(méi)有超出,只需要把right2修正到有效范圍就可以了,如上圖所示,只需要把15修正成8,就可以了。

今天排序的知識(shí)點(diǎn)就得差不多了,本人水平有限,可以知識(shí)點(diǎn)尚未完全覆蓋,請(qǐng)大家多多指教,謝謝!?。。。。?!

數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu)與算法,c語(yǔ)言,排序算法,開(kāi)發(fā)語(yǔ)言,數(shù)據(jù)結(jié)構(gòu),算法,排序文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-844822.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)與算法——排序(C語(yǔ)言實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)與算法】JavaScript實(shí)現(xiàn)排序算法

    【數(shù)據(jù)結(jié)構(gòu)與算法】JavaScript實(shí)現(xiàn)排序算法

    一、大O表示法 大O表示法: 在計(jì)算機(jī)中采用 粗略的度量 來(lái)描述計(jì)算機(jī)算法的 效率 ,這種方法被稱為 “大O”表示法 在 數(shù)據(jù)項(xiàng)個(gè)數(shù) 發(fā)生改變時(shí), 算法的效率 也會(huì)跟著改變。所以說(shuō)算法A比算法B快兩倍,這樣的比較是 沒(méi)有意義 的。 因此我們通常使用 算法的速度 隨著 數(shù)據(jù)

    2024年02月02日
    瀏覽(28)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】歸并排序詳解:歸并排序算法,歸并排序非遞歸實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)與算法】歸并排序詳解:歸并排序算法,歸并排序非遞歸實(shí)現(xiàn)

    歸并排序是一種經(jīng)典的排序算法,它使用了分治法的思想。下面是歸并排序的算法思想: 遞歸地將數(shù)組劃分成較小的子數(shù)組,直到每個(gè)子數(shù)組的長(zhǎng)度為1或者0。 將相鄰的子數(shù)組合并,形成更大的已排序的數(shù)組,直到最終得到一個(gè)完全排序的數(shù)組。 歸并排序的過(guò)程可以分為三

    2024年01月22日
    瀏覽(32)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】:非遞歸實(shí)現(xiàn)快速排序、歸并排序

    【數(shù)據(jù)結(jié)構(gòu)與算法】:非遞歸實(shí)現(xiàn)快速排序、歸并排序

    ?? 個(gè)人主頁(yè) : Quitecoder ?? 專欄 :數(shù)據(jù)結(jié)構(gòu)與算法 上篇文章我們?cè)敿?xì)講解了遞歸版本的快速排序,本篇我們來(lái)探究非遞歸實(shí)現(xiàn)快速排序和歸并排序 快速排序的非遞歸實(shí)現(xiàn)主要依賴于棧(stack)來(lái)模擬遞歸過(guò)程中的函數(shù)調(diào)用棧。遞歸版本的快速排序通過(guò)遞歸調(diào)用自身來(lái)處理子

    2024年03月24日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法C++實(shí)現(xiàn)】3、排序算法

    【數(shù)據(jù)結(jié)構(gòu)與算法C++實(shí)現(xiàn)】3、排序算法

    原視頻為左程云的B站教學(xué) 外層循環(huán) :n個(gè)數(shù)需要冒n-1個(gè)泡上去,剩下的一個(gè)必然是最小的。所以外層循環(huán)執(zhí)行n-1輪 內(nèi)層循環(huán) :比大小,第1個(gè)泡需要比n-1次,第2個(gè)泡,比較n-2次… 選擇: 每次從待排序序列中選擇 最小的一個(gè) 放在已排序序列的后一個(gè)位置 原理類似于對(duì)撲克牌

    2024年02月11日
    瀏覽(23)
  • 常見(jiàn)排序集錦-C語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)

    常見(jiàn)排序集錦-C語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)

    目錄 排序的概念 常見(jiàn)排序集錦 ? ? ?1.直接插入排序 ? ? ?2.希爾排序 ? ? ?3.選擇排序 ? ? ?4.堆排序 ? ? ?5.冒泡排序 ? ? ?6.快速排序 ? ? ? ? ? ? hoare? ? ? ? ? ? ? 挖坑法 ? ? ? ? ? ? 前后指針?lè)?? ? ? ? ? ? 非遞歸 ? ? ?7.歸并排序 ? ? ? ? ? ? 非遞歸 排序?qū)崿F(xiàn)

    2024年02月12日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】用Java實(shí)現(xiàn)七大排序算法

    【數(shù)據(jù)結(jié)構(gòu)】用Java實(shí)現(xiàn)七大排序算法

    目錄 ??1. 排序的概念及引用 1.1 排序的概念 1.2 衡量指標(biāo) 1.2 十個(gè)排序算法 ?1.3 十個(gè)排序性能對(duì)比 ??2. 冒泡排序 2.1 算法描述 2.2 動(dòng)圖 ??代碼優(yōu)化 ??3. 選擇排序 3.1 算法描述 3.2 動(dòng)圖 ?3.3 代碼 ??4. 插入排序 4.1 算法描述 4.2 動(dòng)圖 ?4.3 代碼 ??5 希爾排序 5.1 描述 5.2 動(dòng)圖 ?

    2023年04月23日
    瀏覽(30)
  • 數(shù)據(jù)結(jié)構(gòu)——C語(yǔ)言實(shí)現(xiàn)常見(jiàn)排序(插入排序、希爾排序、選擇排序、堆排序、冒泡排序)

    數(shù)據(jù)結(jié)構(gòu)——C語(yǔ)言實(shí)現(xiàn)常見(jiàn)排序(插入排序、希爾排序、選擇排序、堆排序、冒泡排序)

    現(xiàn)在是北京時(shí)間2023年6月23日13點(diǎn)19分,度過(guò)了一個(gè)非常愉快的端午節(jié)。由于剛從學(xué)?;丶遥幌伦踊锸硰?qiáng)度直升了個(gè)兩三個(gè)檔次。這也導(dǎo)致我的腸胃不堪重負(fù),我也準(zhǔn)備等會(huì)去健身房消耗一下盈余的熱量?;氐郊遗惆闋敔斪呷松詈蟮碾A段才是我這個(gè)暑假最重要的事情。自從

    2024年02月10日
    瀏覽(89)
  • [數(shù)據(jù)結(jié)構(gòu) -- 手撕排序算法第七篇] 遞歸實(shí)現(xiàn)歸并排序

    [數(shù)據(jù)結(jié)構(gòu) -- 手撕排序算法第七篇] 遞歸實(shí)現(xiàn)歸并排序

    目錄 1、歸并的思想 2、歸并排序的思想 2.1 基本思想 2.2 圖解分析 3、歸并排序遞歸版本代碼實(shí)現(xiàn) 3.1 代碼解析 3.2 注意事項(xiàng) 3.2.1錯(cuò)誤劃分:[begin, mid-1],[mid, end] 3.2.2 正確劃分:[begin, mid], [mid+1, end] 4、歸并排序的測(cè)試 5、時(shí)間復(fù)雜度、空間復(fù)雜度分析 5.1 時(shí)間復(fù)雜度 5.2 空間復(fù)雜

    2024年02月16日
    瀏覽(36)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】Java實(shí)現(xiàn)查找與排序

    【算法與數(shù)據(jù)結(jié)構(gòu)】Java實(shí)現(xiàn)查找與排序

    也叫做折半查找,屬于有序查找算法。 前提條件 :數(shù)組數(shù)據(jù)必須有序,從小到大,或者從大到小都是可以的。 如果是無(wú)序的,也可以先進(jìn)行排序。 但是排序之后,會(huì)改變?cè)袛?shù)據(jù)的順序,查找出來(lái)元素位置跟原來(lái)的元素可能是不一樣的,所以排序之后再查找只能判斷當(dāng)前數(shù)

    2024年01月19日
    瀏覽(31)
  • 【數(shù)據(jù)結(jié)構(gòu)】—從冒泡排序絲滑過(guò)度快速排序(含C語(yǔ)言實(shí)現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)】—從冒泡排序絲滑過(guò)度快速排序(含C語(yǔ)言實(shí)現(xiàn))

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?食用指南:本文在有C基礎(chǔ)的情況下食用更佳 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ??? 這就不得不推薦此專欄了: C語(yǔ)言 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?? 今日夜電波:靴の花火—ヨルシカ ? ? ? ? ? ?

    2024年02月08日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包