排序算法

1 快速排序(Quick Sort)

1.1 快速排序(C语言)
#include<stdio.h>
int a[101],n; //定义全局变量,这两个变量需要在子函数中使用

void quicksort(int left,int right)
{
	int i,j,t,temp;
	if(left>right)
	{
		return;	
	}
	
	temp = a[left]; //temp中存的是基准数
	i = left;
	j = right;
	while(i!=j)
	{
		//顺序很重要,要**先从右往左找**
		while(a[j]>=temp && i<j)
		{
			j--;	
		}
		//再从左往右找
		while(a[i]<=temp && i<j)
		{
			i++;	
		}
		//交换两个数在数组中的位置
		if(i<j)
		{
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}
	//最终将基准数归位
	a[left] = a[i];
	a[i] = temp;
	
	quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程
	quicksort(i+1,right);//继续处理右边的,这里是一个递归的过程
	return;
}


int main()
{
	int i,j;
	//读入数据
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);	
	}	
		
	quicksort(1,n);//快速排序调用
	//输出排序后的结果
	for(i=1;i<=n;i++)
	{
		printf("%d ",a[i]);
	}	
	
	getchar();getchar();
	return 0;
}
1.2 快速排序(Python)
def quicksort(array):
    if len(array) < 2:
        return array;  # 基线条件:为空或只包含一个元素的数组是“有序”的
    else:
        pivot = array[0]  # 选择基准值

        less = [i for i in array[1:] if i <= pivot]  # 由所有小于等于基准值的元素组成的子数组
        greater = [i for i in array[1:] if i > pivot]  # 由所有大于等于基准值的元素组成的子数组

        return quicksort(less) + [pivot] + quicksort(greater)


alist = []
print("请输入数")
a = input()
alist = a.split(" ")    #python使用split()函数进行分割
                        # split(“”)函数的参数可以是任何分隔符,包括(a,b,c….;1,2,3;%,!,*,空格)
array = [int(alist[i]) for i in range(len(alist))] #for循环,把每个字符转成int值
print(quicksort(array))

2 堆排序(HeapSort)

1.1 最小堆排序(C语言)
#include<stdio.h>
int h[101]; //用来存放堆的数组
int n; //用来存储堆中元素的个数,也就是堆的大小

//交换函数,用来交换堆中的两个元素的值
void swap(int x,int y)
{
	int t;
	t = h[x];
	h[x] = h[y];
	h[y] = t;
	return;
}

//向下调整函数
void siftdown(int i) //传入一个需要向下调整的节点编号i,这里传入1,即从对的顶点开始向下调整
{
	int t, flag = 0; //flag用来标记是否需要继续向下调整
	//当i结点有儿子(其实是至少有左儿子)并且有需要继续调整的时候循环就执行
	while (i * 2 <= n && flag == 0)
	{
		//首先判断它和左儿子的关系,并用t纪录值较小的结点编号
		if (h[i] > h[i * 2])
			t = i * 2;
		else
			t = i;
		//如果它有右儿子,再对右儿子进行讨论
		if (i * 2 + 1 <= n)
		{
			//如果右儿子的值更小,更新较小的结点编号
			if (h[t] > h[i * 2 + 1])
				t = i * 2 + 1;
		}
		//如果发现最小的结点编号不是自己,说明子结点中有比父结点更小的
		if (t != i)
		{
			swap(t, i); //交换它们,注意swap函数需要自己来写
			i = t; //更新i为刚才与它交换的儿子结点的编号,便于接下来继续向下调整
		}
		else
			flag = 1; //否则说明当前的父结点已经比两个子结点都要小了,不需要再进行调整了
	}
	return;
}

//建立堆的函数
void creat()
{
	int i;
	//从最后一个非叶结点到第1个结点依次进行向下调整
	for (i = n / 2; i >= 1; i--)
	{
		siftdown(i);
	}
	return;
}

//删除最大的元素
int deletemax()
{
	int t;
	t = h[1]; //用一个临时变量记录堆顶点的值
	h[1] = h[n]; //将堆的最后一个点赋值到堆顶
	n--; //堆的元素减少1
	siftdown(1); //向下调整
	return t; //返回之前记录的堆的顶点的最小值
}

int main()
{
	int i, num;
	//读入要排序的数字的个数
	scanf("%d", &num);

	for (i = 1; i <= num; i++)
		scanf("%d", &h[i]);
	n = num;

	//建堆
	creat();

	//删除顶部元素,连续删除n次,其实也就是从小到大把数输出来
	for (i = 1; i <= num; i++)
		printf("%d ", deletemax());

	getchar();
	getchar();
	return 0;
}
1.2 最大堆排序(C语言)
#include<stdio.h>
int h[101]; //用来存放堆的数组
int n; //用来存储堆中元素的个数,也就是堆的大小

//交换函数,用来交换堆中的两个元素的值
void swap(int x,int y)
{
	int t;
	t = h[x];
	h[x] = h[y];
	h[y] = t;
	return;
}

//向下调整函数
void siftdown(int i) //传入一个需要向下调整的节点编号i,这里传入1,即从对的顶点开始向下调整
{
	int t, flag = 0; //flag用来标记是否需要继续向下调整
	//当i结点有儿子(其实是至少有左儿子)并且有需要继续调整的时候循环就执行
	while (i * 2 <= n && flag == 0)
	{
		//首先判断它和左儿子的关系,并用t纪录值较大的结点编号
		if (h[i] < h[i * 2]) //#################变化处#################### 
			t = i * 2;
		else
			t = i;
		//如果它有右儿子,再对右儿子进行讨论
		if (i * 2 + 1 <= n)
		{
			//如果右儿子的值更小,更新较大的结点编号
			if (h[t] < h[i * 2 + 1]) //#################变化处#################### 
				t = i * 2 + 1;
		}
		//如果发现最小的结点编号不是自己,说明子结点中有比父结点更大的
		if (t != i)
		{
			swap(t, i); //交换它们,注意swap函数需要自己来写
			i = t; //更新i为刚才与它交换的儿子结点的编号,便于接下来继续向下调整
		}
		else
			flag = 1; //否则说明当前的父结点已经比两个子结点都要小了,不需要再进行调整了
	}
	return;
}

//建立堆的函数
void creat()
{
	int i;
	//从最后一个非叶结点到第1个结点依次进行向下调整
	for (i = n / 2; i >= 1; i--)
	{
		siftdown(i);
	}
	return;
}

//#################变化处#################### 
//堆排序 
void heapsort() //每次把最大的放数组最后 
{
	while(n > 1)
	{
		swap(1,n);
		n--;
		siftdown(1);
	}
	return;
}

int main()
{
	int i, num;
	//读入要排序的数字的个数
	scanf("%d", &num);

	for (i = 1; i <= num; i++)
		scanf("%d", &h[i]);
	n = num;

	//建堆
	creat();
	
	//堆排序
	heapsort(); 

	//输出
	for (i = 1; i <= num; i++)
		printf("%d ", h[i]);

	getchar();
	getchar();
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值