#include<stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用voidquicksort(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();return0;}
1.2 快速排序(Python)
def quicksort(array):iflen(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] # 由所有大于等于基准值的元素组成的子数组
returnquicksort(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 inrange(len(alist))] #for循环,把每个字符转成int值
print(quicksort(array))
2 堆排序(HeapSort)
1.1 最小堆排序(C语言)
#include<stdio.h>
int h[101];//用来存放堆的数组
int n;//用来存储堆中元素的个数,也就是堆的大小//交换函数,用来交换堆中的两个元素的值voidswap(int x,int y){
int t;
t = h[x];
h[x]= h[y];
h[y]= t;return;}//向下调整函数voidsiftdown(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;}//建立堆的函数voidcreat(){
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--;//堆的元素减少1siftdown(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();return0;}
1.2 最大堆排序(C语言)
#include<stdio.h>
int h[101];//用来存放堆的数组
int n;//用来存储堆中元素的个数,也就是堆的大小//交换函数,用来交换堆中的两个元素的值voidswap(int x,int y){
int t;
t = h[x];
h[x]= h[y];
h[y]= t;return;}//向下调整函数voidsiftdown(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;}//建立堆的函数voidcreat(){
int i;//从最后一个非叶结点到第1个结点依次进行向下调整for(i = n /2; i >=1; i--){siftdown(i);}return;}//#################变化处#################### //堆排序 voidheapsort()//每次把最大的放数组最后 {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();return0;}