推荐一个讲解排序算法很好的博客

1.推荐一个讲解排序算法很好的博客

之前自己结合教科书的例子实现了一些基本的排序算法。前几天看了关注的一个大佬的排序算法总结的笔记,看完后感觉对这些排序算法的理解更深刻了,而且大佬的总结的非常易懂,代码的实现如同他的讲解一样简单且容易记住,和他的代码一对比,我自己的一些算法的实现很绕,万一面试让写,会很容易出错。

大佬博客:https://blog.csdn.net/jiange_zh/category_5787591.html?spm=1001.2014.3001.5482

2.代码汇总

看了大佬博客后,我现在能够很快地写出这些常用排序查找算法了。

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

//辅助输出的函数
void outputarray(int *g,int size)
{
	for (int i = 0; i < size;++i)
	{
		printf("%d ",g[i]);
	}
	printf("\n");
}

//select_sort.c
void select_sort(int *g,int size)
{
	for (int i = 0; i < size;i++)
	{
		int min_idx = i;
		for (int j = i+1;j < size;j++)
		{
			if (g[j] < g[min_idx])
			{
				min_idx = j;
			}
		}
		
		if (min_idx != i)
		{
			g[i] ^= g[min_idx];
			g[min_idx] ^= g[i];
			g[i] ^= g[min_idx];
		}
	}
}

//insert_sort.c
void insert_sort(int *g,int size)
{
	for (int i = 1;i < size;i++)
	{
		int j = i-1;
		while (j >=0 && g[j] > g[i])
		{
			g[j+1] = g[j];
			--j;
		}
		g[j+1] = g[i];
	}
}

//bubble_sort.c
void bubble_sort(int *g,int size)
{
	for (int i = 0; i < size-1;++i)
	{
		int bswitch = 0;
		for (int j = size-1;j > i;--j)
		{
			if (g[j-1] > g[j])
			{
				g[j-1] ^= g[j];
				g[j] ^= g[j-1];
				g[j-1] ^= g[j];
				bswitch = 1;
			}
		}
		if (bswitch == 0)
		{
			break;
		}
	}
}

//quick_sort.c
int parttion(int *g,int left,int right)
{
	int key = g[left];
	while (left < right)
	{
		while (left < right && g[right] >= key)
		{
			right--;
		}
		g[left] = g[right];
		while (left < right && g[left] <= key)
		{
			left++;
		}
		g[right] = g[left];
	}
	
	g[left] = key;
	return left;
}

void quick_sort(int *g,int left,int right)
{
	if (left < right)
	{
		int piviot = parttion(g,left,right);
		quick_sort(g,left,piviot-1);
		quick_sort(g,piviot+1,right);
	}
}

void quicksort(int *g,int size)
{
	int left = 0;
	int right = size-1;
	quick_sort(g,left,right);
}


//heap_sorrt.c
void adjustdown(int *g,int i,int size)
{
	int l = 2*i+1;
	int r = 2*i+2;
	int largest = i;
	
	if (l < size && g[largest] < g[l])
	{
		largest = l;
	}
	
	if (r < size && g[largest] < g[r])
	{
		largest = r;
	}
	
	if (largest != i)
	{
		g[i] ^= g[largest];
		g[largest] ^= g[i];
		g[i] ^= g[largest];
		adjustdown(g,largest,size);
	}
}

void buildmaxheap(int *g,int size)
{
	for (int i = (size/2)-1;i >=0;--i)
	{
		adjustdown(g,i,size);
	}
}

void heapsort(int *g,int size)
{
	buildmaxheap(g,size);
	for (int i = size-1;i >= 1;--i)
	{
		g[i] ^= g[0];
		g[0] ^= g[i];
		g[i] ^= g[0];
		adjustdown(g,0,i);
	}
}

//merge_sort.c
void merge(int *g,int left,int mid,int right)
{
	int *tmp = (int *)malloc(sizeof(int)*(right-left+1));
	int index = 0;
	int L_idx = left;
	int R_idx = mid+1;
	
	while (L_idx <=mid && R_idx <=right)
	{
		if (g[L_idx] <= g[R_idx])
		{
			tmp[index++] = g[L_idx++];
		}
		else 
		{
			tmp[index++] = g[R_idx++];
		}
	}
	
	while (L_idx <= mid)
	{
		tmp[index++] = g[L_idx++];
	}
	
	while (R_idx <= right)
	{
		tmp[index++] = g[R_idx++];
	}
	
	for (int i = left;i <= right;++i)
	{
		g[i] = tmp[i-left];
	}
	
	free(tmp);
}

void merge_sort(int *g,int left,int right)
{
	if (left >= right)
	{
		return;
	}
	
	int mid = (left + right)/2;
	merge_sort(g,left,mid);
	merge_sort(g,mid+1,right);
	merge(g,left,mid,right);
}

void mergesort(int *g,int size)
{
	if (!g || size <= 0)
	{
		return;
	}
	
	int left = 0;
	int right = size-1;
	merge_sort(g,left,right);
}


int main()
{
	int g[] = {25,28,520,105,110,1,2,25,100,101,21,23,3,92,94,98,3,61,4,19,24,102,104,53,70,71,82,83,86,12};
	int size = sizeof(g)/sizeof(g[0]);
	
	select_sort(g,size);
	outputarray(g,size);
	
	insert_sort(g,size);
	outputarray(g,size);
	
	bubble_sort(g,size);
	outputarray(g,size);
	
	quicksort(g,size);
	outputarray(g,size);
	
	heapsort(g,size);
	outputarray(g,size);
	
	mergesort(g,size);
	outputarray(g,size);
	
	return 0;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值