0
点赞
收藏
分享

微信扫一扫

Linux yum 没有可用软件包 fping。 错误:无须任何处理 的解决办法

Go_Viola 2023-11-06 阅读 40

排序详解

冒泡排序

于是我们的代码就有了

void BubbleSort(int* a, int n) {
	for (int i = 0; i < n - 1; i++) {
	int exchange=0;
		for (int j = 0; j < n - 1 - i; j++) {
			if (a[j] > a[j + 1]) {
				int tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
				exchange=1;
			}
		}
		if(exchange==1){
		break;
		}
	}
}

插入排序

然后我们的代码就有了

void InsertSort(int* a, int n) {
	for (int i = 1; i < n; i++) {
		int tmp = a[i];
		int end = i - 1;
		while (end >= 0) {
			if (a[end] > tmp) {
				a[end + 1] = a[end];
			}
			else {
				break;
			}
			end--;
		}
		a[end + 1] = tmp;
	}
}

希尔排序

void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		//gap = gap / 2;
		gap = gap / 3 + 1;

		for (int i = 0; i < n - gap; ++i)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}

选择排序

void SelectSort(int* a, int n) {
	for (int i = 0; i < n - 1; i++) {
		int mini = i;
		for (int j = i + 1; j < n; j++) {
			if (a[j] < a[mini]) {
				mini = j;
			}
		}
		Swap(&a[i], &a[mini]);
	}
}
void SelectSort(int* a, int n) {
	int start = 0;
	int end = n - 1;
	while (start < end) {
		int maxi = start;
		int mini = start;
		for (int i = start + 1; i <= end; i++) {
			if (a[i] > a[maxi]) {
				maxi = i;
			}
			if (a[i] < a[mini]) {
				mini = i;
			}
		}
		Swap(&a[start], &a[mini]);
		if (start == maxi) {
			maxi = mini;
		}
		Swap(&a[end], &a[maxi]);
		start++;
		end--;
	}
}

快速排序

 void QuickSort1(int* a, int begin, int end) {
	if (begin >= end) {
		return;
	}
	int keyi = begin;
	int left = begin;
	int right = end;
	while (left < right) {
		while (a[right] >= a[keyi] && left < right) {
			right--;
		}
		while (a[left] <= a[keyi] && left<right) {
			left++;
		}
		
		Swap(&a[left], &a[right]);
	}
	Swap(&a[keyi], &a[left]);
	QuickSort1(a, begin, left - 1);
	QuickSort1(a, left + 1, end);

}

 void QuickSort2(int* a, int begin, int end) {
	 if (begin >= end) {
		 return;
	 }
	 int tmp = a[begin];
	 int pit = begin;
	 int left = begin;
	 int right = end;
	 while (left<right) {
		 while (left < right && tmp <= a[right]) {
			 right--;
		 }
		 Swap(&a[pit], &a[right]);
		 pit = right;
		 while (left < right && tmp >= a[left]) {
			 left++;
		 }
		 Swap(&a[pit], &a[left]);
		 pit = left;
	 }
	 a[pit] = tmp;
	 QuickSort2(a, begin, pit - 1);
	 QuickSort2(a, pit + 1, end);
 }

归并排序

 void _MergeSort(int* a, int* tmp, int begin, int end) {
	 if (end <= begin) {
		 return;
	 }
	 int mid = (end + begin) / 2;
	 _MergeSort(a, tmp, begin, mid);
	 _MergeSort(a, tmp, mid+1 , end);
	 int cur = begin;
	 int x1 = begin;
	 int x2 = mid;
	 int x3 = mid+ 1;
	 int x4 = end;
	 while (x1 <= x2 && x3 <= x4) {
		 if (a[x1] < a[x3]) {
			 tmp[cur++] = a[x1++];
		 }
		 else {
			 tmp[cur++] = a[x3++];
		 }
	
	 }
	 while (x1 <= x2) {
		 tmp[cur++] = a[x1++];
	 }
	 while (x3 <= x4) {
		 tmp[cur++] = a[x3++];
	 }
 	 memcpy(a+begin, tmp+begin, sizeof(int) * (end - begin + 1));

 }

 void MergeSort(int* a, int n) {
	 int* tmp = (int*)malloc(sizeof(int) * n);
	 if (tmp == NULL) {
		 perror("malloc fail");
		 exit(-1);
	 }
	 _MergeSort(a, tmp, 0, n - 1);
	 free(tmp);
 }

排序确实是数据结构这门课中非常重要的一环,鉴于我是初学者,对各个排序的理解还是不够深彻,只能先潦草的把这篇博客写完,等我以后理解的更加深彻之后,我肯定会回来完善这篇博客的,话不多说,我先发布了


举报

相关推荐

0 条评论