Acm入门7:排序算法(未完 春节后更新)

排序算法种类:

冒泡 选择 插入(希尔)

快速排序 分组排序 基数排序 桶排序 堆排序 归并排序 

#include <stdio.h>

void print(int* a, int len, bool isBefore = true);

int main() {
	int arr[10] = { 1,9,66,0,33,5,2,88,666,233 };

	print(arr, 10);
	print(arr, 10, false);
	while (1);
	return 0;
}

void print(int* a, int len, bool isBefore) {

	if (isBefore)
		printf("before sort:");
	else
		printf("after  sort:");

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

中间填充排序算法

冒泡排序(最简单):

思想(升序):

比较相邻的两个元素哪个比较大,若大的在后面,不管,若小的在后面交换

一轮过后,第len个数据就是最大的,

#include <stdio.h>


void print(int* a, int len, bool isBefore = true);
void bubble_sort(int* a, int len);

int main() {
	int arr[10] = { 1,9,66,0,33,5,2,88,666,233 };

	print(arr, 10);
	printf("bubble_sort\n");
	bubble_sort(arr, 10);
	print(arr, 10, false);
	while (1);
	return 0;
}

//冒泡排序

void bubble_sort(int* a, int len)
{
	int temp;
	for (int i = 0; i < len; i++) {//外层循环
		for (int j = 0; j < len - i - 1; j++) {
			printf("i:%d,j:%d", i, j);
			if (a[j] > a[j + 1]) {
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
}
void print(int* a, int len, bool isBefore) {

	if (isBefore)
		printf("before sort:");
	else
		printf("after  sort:");

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

选择排序:从待排数组中选择最合适的

一轮选一个最小的,下一轮继续选个最小的,9轮之后即可

#include <stdio.h>

void select_sort(int* a, int len);
void print(int* a, int len, bool isBefore = true);

int main() {
	int arr[10] = { 1,9,66,0,33,5,2,88,666,233 };

    void select_sort(arr, 10);
	print(arr, 10, false);
	while (1);
	return 0;
}

void select_sort(int* a, int len) {
	int temp;
	int minidx;
	for (int i = 0; i < len - 1; i++) {
		temp = a[i];
		minidx = i;
		for (int j = i; j < len; j++) {
			minidx = (a[j] < a[minidx]) ? j : minidx;
		}
		a[i] = a[minidx];
		a[minidx] = temp;
	}
}

void print(int* a, int len, bool isBefore) {

	if (isBefore)
		printf("before sort:");
	else
		printf("after  sort:");

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

插入排序

先假设数组有序,每次往有序数组中插入一个

#include <stdio.h>
#include <algorithm>

void print(int* a, int len, bool isBefore = true);
void insert_sort(int* a, int len);
int main() {
	int arr[10] = { 1,9,66,0,33,5,2,88,666,233 };
	printf("insert_sort\n");
	insert_sort(arr, 10);
	print(arr, 10, false);
	while (1);
	return 0;
}
void insert_sort(int* a, int len) {
	int temp;
	int j;
	for (int i = 1; i < len; i++) {
		temp = a[i];
		j = i - 1;
		while (j >= 0 && a[j] > temp) {
			a[j + 1] = a[j];
			j--;
		}
		a[j + 1] = temp;
		print(a, 10);
	}

}

void print(int* a, int len, bool isBefore) {

	if (isBefore)
		printf("before sort:");
	else
		printf("after  sort:");

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

希尔排序(对插入排序时间复杂度的优化)

引入步长概念,每次按照步长分组,组内做插入排序

步长每次变化,通常折半

#include <stdio.h>

void print(int* a, int len, bool isBefore = true);
void shell_sort(int* a, int len);
int main() {
	int arr[10] = { 1,9,66,0,33,5,2,88,666,233 };

	shell_sort(arr, 10);
	print(arr, 10, false);
	while (1);
	return 0;
}
void shell_sort(int* a, int len) {
	int step = len / 2;
	int temp = 0;
	int j;
	while (step) {

		for (int i = temp; i < len; i++) {
			temp = a[i];
			j = i - step;
			while (j >= 0 && a[j] > temp) {
				a[j + 1] = a[j];
				j--;
			}
			a[j + step] = temp;
			print(a, 10);
		}
		step = step / 2;
	}

}
void print(int* a, int len, bool isBefore) {

	if (isBefore)
		printf("before sort:");
	else
		printf("after  sort:");

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

上一篇:【SpringCloud-Alibaba系列教程】6.openfegin的使用


下一篇:域名解析如何配置