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");
}

【深基9.例4】求第 k 小的数 - 洛谷

快速排序

P1923 【深基9.例4】求第 k 小的数

题目描述

输入 nn(1 \le n < 50000001≤n<5000000 且 nn 为奇数)个数字 a_iai​(1 \le a_i < {10}^91≤ai​<109),输出这些数字的第 kk 小的数。最小的数是第 00 小。

请尽量不要使用 nth_element 来写本题,因为本题的重点在于练习分治算法。

输入格式

输出格式

输入输出样例

输入 #1复制

5 1
4 3 2 1 5

输出 #1复制

2
#include<iostream>
using namespace std;
int ans,k=0,n=0;
const int u=11000001;
int a[u];
void qsort(int a[],int l,int r);
int main()
{
	cin >> n>>k;
	for (int i = 0; i < n; ++i)
		scanf("%d", &a[i]);
	qsort(a, 0, n-1 );
	cout << ans << endl;
	return 0;
}


void qsort(int a[], int l, int r)
{
	if (l == r)
	{
		ans = a[l];
		return;
	}
	int i = l, j = r, temp, flag = a[(l + r) / 2];
	do
	{
		while (a[i] < flag)i++;
		while (a[j] > flag)--j;
		if (i <= j)
		{
			temp = a[i]; a[i] = a[j]; a[j] = temp;
			++i, --j;
		}
	} while (i <= j);
	if (k <= j)
		qsort(a, l, j);
	else if (i <= k)
		qsort(a, i, r);
	else
		qsort(a, j + 1, i - 1);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值