各类排序算法

目录

1.选择排序

2.冒泡排序

3.插入排序

4.归并排序

5.堆排序

6.快速排序

7.桶排序:

               1.计数排序

               2.基数排序

总结:


1.选择排序

#include <stdio.h>
#include <stdlib.h>

void swap(int* arr, int i, int j) {
	arr[i] = arr[i] ^ arr[j];
	arr[j] = arr[i] ^ arr[j];
	arr[i] = arr[i] ^ arr[j];
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int* arr = (int*)malloc(4 * n);
	for (int i = 0; i < n; i++) {
		scanf("%d", arr + i);
	}

	int cur = 0;
	for (int i = 0; i < n-1; i++) {
		cur = i;
		for (int j = i + 1; j < n; j++) {
			if (arr[j] < arr[cur]) {
				cur = j;
			}
		}
		if (cur != i) {
			swap(arr, i, cur);
		}
	}

	for (int i = 0; i < n; i++) {
		printf("%d ", arr[i]);
	}

	return 0;

}

2.冒泡排序

#include <stdio.h>
#include <stdlib.h>

void swap(int* arr, int x, int y) {
	int tmp = arr[x];
	arr[x] = arr[y];
	arr[y] = tmp;
}

void BubbleSort(int* arr, int L, int R) {
	if (arr == NULL || R - L - 1 < 2) {
		return;
	}

	for (int i = R; i > L; i--) {
		for (int j = L; j < i; j++) {
			if (arr[j] > arr[j + 1]) {
				swap(arr, j, j + 1);
			}
		}
	}
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int* arr = (int*)malloc(sizeof(int)*n);
	for (int i = 0; i < n; i++) {
		scanf("%d", arr + i);
	}

	BubbleSort(arr, 0, n - 1);

	for (int i = 0; i < n; i++) {
		printf("%d ", arr[i]);
	}

	return 0;
}

3.插入排序

#include <stdio.h>
#include <stdlib.h>

void swap(int* arr, int i, int j) {
	arr[i] = arr[i] ^ arr[j];
	arr[j] = arr[i] ^ arr[j];
	arr[i] = arr[i] ^ arr[j];
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int* arr = (int*)malloc(n * 4);
	for (int i = 0; i < n; i++) {
		scanf("%d", arr + i);
	}

	for (int i = 1; i < n; i++) {
		for (int j = i; j > 0; j--) {
			if (arr[j] < arr[j - 1]) {
				swap(arr, j, j - 1);
			}
			else {
				break;
			}
		}
	}

	for (int i = 0; i < n; i++) {
		printf("%d ", arr[i]);
	}

	return 0;
}

4.归并排序

#include <stdio.h>
#include <stdlib.h>

void Merage(int* arr, int L, int M, int R) {
	
	int* help = (int*)malloc(sizeof(int)*(R - L + 1));
	int p1 = L, p2 = M + 1;
	int i = 0;
	while (p1 <= M && p2 <= R) {
		help[i++] = (arr[p1] > arr[p2] ? arr[p2++] : arr[p1++]);
	}

	while (p1 <= M) {
		help[i++] = arr[p1++];
	}

	while (p2 <= R) {
		help[i++] = arr[p2++];
	}

	for (int j = 0; j <= R - L; j++) {
		arr[L + j] = help[j];
	}
	free(help);
	help = NULL;
}

void Merage_Sort(int* arr, int L, int R) {
	if (L == R) {
		return;
	}

	int mid = (L + ((R - L) >> 1));
	Merage_Sort(arr, L, mid);
	Merage_Sort(arr, mid + 1, R);

	Merage(arr, L, mid, R);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int* arr = (int*)malloc(sizeof(int)*n);
	for (int i = 0; i < n; i++) {
		scanf("%d", arr + i);
	}

	Merage_Sort(arr, 0, n - 1);

	for (int i = 0; i < n; i++) {
		printf("%d ", arr[i]);
	}


	return 0;
}

5.堆排序

#include <stdio.h>
#include <stdlib.h>

int size = 0;

void swap(int* arr,int x,int y){
	if (arr == NULL) {
		return;
	}

	int tmp = arr[x];
	arr[x] = arr[y];
	arr[y] = tmp;
}

void heepdive(int* arr, int width) {
	if (arr == NULL){
		return;
	}
	int index = width;
	while (arr[index] > arr[(index - 1) / 2]) {
		swap(arr, index, (index - 1) / 2);
		index = (index - 1) / 2;
	}
}

void HeepIfy(int* arr) {
	if (arr == NULL) {
		return;
	}
	int index = 0, largest = 0;
	int leaf = 2 * index + 1;
	while (leaf < size) {
		largest = (leaf + 1 < size) && (arr[leaf] < arr[leaf + 1]) ? leaf + 1 : leaf;
		largest = arr[index] < arr[largest] ? largest : index;
		if (largest == index) {
			break;
		}
		swap(arr, index, largest);
		index = largest;
		leaf = index * 2 + 1;
	}
}

void HeepSort(int* arr, int L, int R) {
	
	for (int i = 0; i < (R - L + 1); i++) {
		swap(arr, L, size - 1);
		size--;
		HeepIfy(arr);
	}
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int* arr = (int*)malloc(sizeof(int)*n);
	for (int i = 0; i < n; i++) {
		scanf("%d", arr + size);
		size++;
		heepdive(arr, size - 1);
	}
	
	 HeepSort(arr, 0, n - 1);

	for (int i = 0; i < n; i++) {
		printf("%d ", arr[i]);
	}

	return 0;
}

6.快速排序

#include <stdio.h>
#include <stdlib.h>

int random(int a, int b) {
	return (rand() % b + a);
}

void swap(int* arr, int x, int y) {
	int tmp = arr[x];
	arr[x] = arr[y];
	arr[y] = tmp;
}

int* sort(int* arr, int L, int R) {
	int small = L - 1;
	int more = R;
	int cur = L;
	while (cur < more) {
		if (arr[cur] < arr[R]) {
			swap(arr, cur++, ++small);
		}
		else if (arr[cur] > arr[R]) {
			swap(arr, cur, --more);
		}
		else {
			cur++;
		}
	}
	swap(arr, more, R);
	int* help = (int*)malloc(4 * 2);
	help[0] = small + 1;
	help[1] = more;
	return help;
}

void QuickSort(int* arr, int L, int R) {
	if (arr == NULL || R - L + 1 < 2) {
		return;
	}

	if (L >= R) {
		return;
	}

	swap(arr, random(L, R), R);

	int* p = sort(arr, L, R);
	QuickSort(arr, L, *p - 1);
	QuickSort(arr, *(p + 1) + 1, R);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int* arr = (int*)malloc(sizeof(int)*n);
	for (int i = 0; i < n; i++) {
		scanf("%d", arr + i);
	}

	QuickSort(arr, 0, n - 1);

	for (int i = 0; i < n; i++) {
		printf("%d ", arr[i]);
	}

	return 0;
}

7.桶排序:

               1.计数排序

               2.基数排序

#include <stdio.h>
#include <stdlib.h>

int getDigit(int num, int i) {
	int res = 0;
	i -= 1;
	while (i--) {
		res = num / 10;
	}

	return num % 10;
}

void RadixSort(int* arr, int L, int R, int digit) {
	if (arr == NULL || R - L + 1 < 2) {
		return;
	}

	int* help = (int*)malloc(sizeof(int)*(R - L + 1));
	int* count = (int*)malloc(sizeof(int) * 10);
	
	for (int i = 1; i <= digit; i++) {
		for (int c = 0; c < 10; c++) {
			count[c] = 0;
		}

		for(int j = L; j <= R; j++) {
			count[getDigit(arr[j], i)]++;
		}

		for (int p = 1; p < 10; p++) {
			count[p] += count[p - 1];
		}

		for (int q = R; q >=L; q--) {
			help[--count[getDigit(arr[q], i)]] = arr[q];
		}

		for (int z = L; z <= R; z++) {
			arr[z] = help[z-L];
		}
	}
}

int maxbits(int* arr, int n) {
	if (arr == NULL) {
		return 0;
	}
	int max = arr[0], i = 0, res = 0;
	for (i = 0; i < n; i++) {
		max = max < arr[i] ? arr[i] : max;
	}

	while (max > 0) {
		res++;
		max /= 10;
	}

	return res;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int* arr = (int*)malloc(sizeof(int)*n);
	for (int i = 0; i < n; i++) {
		scanf("%d", arr + i);
	}

	RadixSort(arr, 0, n - 1, maxbits(arr, n));

	for (int i = 0; i < n; i++) {
		printf("%d ", arr[i]);
	}

	return 0;
}

总结:

1.不具备稳定性的排序:选择排序,快速排序,堆排序;

   具备稳定性的排序:冒泡排序,插入排序,归并排序,一切桶排序思想下的排序。

目前没有找到时间复杂度为O(n*log(n)),额外空间复杂度为O(1),又稳定的排序。

2.

时间复杂度空间复杂度是否具有稳定性
选择排序O(n^2)O(1)
冒泡排序O(n^2)O(1)
插入排序O(n^2)O(1)
归并排序O(n*log(n))O(n)
快速排序O(n*log(n))O(log(n))
堆排序O(n*log(n))O(1)

3.工程上对算法的改进:1.充分利用O(n^2)和O(n*log(n))各自的优势;2.稳定性的考虑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值