排序算法之快速排序、计数排序

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//快速排序算法,一个是递归,一个就是之前的分割算法
void Quick_sort(int a[],int high,int low);
int split(int a[],int high,int low);

void Quick_sort(int a[],int high,int low)
{
	int mid;
	if(low>=high) return;

	mid=split(a,high,low);
	Quick_sort(a,mid-1,low);
	Quick_sort(a,high,mid+1);
}

int split(int a[],int high,int low)
{
	int part_element=a[low];
	for(;;)
	{
		while(a[high]>=part_element&&low<high)
			high--;
		if(low>=high) break;
		a[low++]=a[high];
		while(a[low]<=part_element&&low<high)
			low++;
		if(low>=high) break;
		a[high--]=a[low];
	}
	a[high]=part_element;
	return high;

}

void Count_sort(int a[],int b[],int k,int n)
//k是范围,n是个数,b数组是排序好的数组
{
	int c[1000]={0};
	for(int i=0;i<n;i++)
		c[a[i]]++;//计数就是在对应数组标号是计数
	for(int j=1;j<=k;j++)
		c[j]=c[j]+c[j-1];//每个元素计的是之前c数组元素之和,也就是a[]的个数
	//这样c数组存储的变量也有了大小,可以直接当记号
	for(int i=n-1;i>=0;i--)
	{
		b[c[a[i]]-1]=a[i];
		c[a[i]]--;//这个语句针对有重复数字的情况
	}
}

int main(void)
{
	int len = 0, num;
	int a[100] = { 0 };
	int b[100] = { 0 };
	while (1)
	{
		scanf("%d", &num);
		a[len++] = num;
		if (getchar() == '\n') break;
	}

	Count_sort(a, b, 1000, len);
	for (int i = 0; i < len; i++) printf("%d  ", b[i]);
}
posted @ 2020-11-30 00:13  empty_thought  阅读(131)  评论(0)    收藏  举报