#include <stdio.h>
void SelectSort(int r[],int n);//选择排序
void BubbleSort();//冒泡排序
void MergeSort();//归并排序
void QuickSort();//快速排序
void Merge();//(归并里合并)子序列
void Insert();//插入排序
void HeapSort();//堆排序
int Partition();
int main(){
int r[6];
int i;
printf("请输入:");
for(i=0;i<6;i++){
scanf("%d",&r[i]);
}
for(i=0;i<6;i++){
printf("%d ",r[i]);
}
printf("\n");
printf("\n");
//SelectSort(r,6);
//BubbleSort(r,6);
//MergeSort(r,0,5);
//Insert(r,6);
//QuickSort(r,0,5);
HeapSort(r,6);
for(i=0;i<6;i++){
printf("%d ",r[i]);
}
printf("\n");
return 0;
}
void SelectSort(int r[],int n){
int i,j,index,temp;
for(i=0;i<n-1;i++){//进行n-1次换位
index=i;
for(j=i+1;j<n;j++){
if(r[j]<r[index]) index=j;
}
if(index!=i) {temp=r[i];r[i]=r[index];r[index]=temp;}
}
}
void BubbleSort(int r[],int n){//
int j,bound,exchange=n-1;//第一趟起泡排序区间【0,n-1】
while(exchange!=0){//当上一趟排序有记录交换时
bound=exchange;exchange=0;
for(j=0;j<bound;j++){
if(r[j]>r[j+1]){
int temp=r[j];r[j]=r[j+1];r[j+1]=temp;//交换
exchange=j;//记录每一次交换的位置
}
}
}
}
void Merge(int r[],int r1[],int s,int m,int t){//合并子序列
int i=s,j=m+1;
//int flag=0;
int flag=s;
//for(i=s;i<=m;i++){
//for(j=m+1;j<=t;j++){
while(i<=m&&j<=t){
if(r[i]<=r[j]) {r1[flag++]=r[i];i++;}
else {r1[flag++]=r[j]; j++;}
}
while(i<=m){//若第一个子序没处理完,则进行收尾
r1[flag++]=r[i++];
}
while(j<=t){//若第二个子序没处理完,则进行收尾
r1[flag++]=r[j++];
}
}
void MergeSort(int r[],int s,int t){//对序列r[s]~r[t]进行归并排序
int m;
int i;
int r1[1000];
if(s==t) return;//只有一个记录
else{
m=(s+t)/2; //划分
MergeSort(r,s,m);//求解子问题1,归并排序前半部分(分治法)
MergeSort(r,m+1,t);//求解子问题2,归并排序后半部分
Merge(r,r1,s,m,t);
for(i=s;i<=t;i++){
r[i]=r1[i];//将有序序列传回数组r中
}
}
}
int Partition(int r[],int first,int end){
int i=first,j=end;
while(i<j){
while(i<j&&r[i]<=r[j]) j--;//右侧扫描
if(i<j){
int temp=r[i];r[i]=r[j];r[j]=temp;//交换
i++;
}
while(i<j&&r[i]<=r[j]) i++;//左侧扫描
if(i<j){
int temp=r[i];r[i]=r[j];r[j]=temp;//交换
i--;
}
}
return i;
}
void QuickSort(int r[],int first,int end){
int pivot;
if(first<end){
pivot=Partition(r,first,end);//划分 pivot轴值
QuickSort(r,first,pivot-1);//求解子问题1,对左侧子序列进行快排
QuickSort(r,pivot+1,end);//求解子问题2,对右侧子序列进行快排
}
}
void Insert(int r[],int n){//n个元素,放r[1~n]//将待排序的记录插入到已经已排好序的序列中
int i,j;
for(i=2;i<=n;i++){//待排记录序列于r[1~n]
r[0]=r[i];//暂存待插记录,设置哨兵
for(j=i-1;r[0]<r[j];j--){//从后往前找待插记录!!!!!!!!!!!!!!!!!!!!!!
r[j+1]=r[j];//比r[0]小大,后移
}
r[j+1]=r[0];
}
}
void SiftHeap(int r[],int k,int n){//调整堆
int i,j,temp;
i=k;j=2*i+1;//置i为要筛的结点,j为i的做孩子
while(j<n){//筛选还没进行到叶子
if(j<n-1&&r[j]<r[j+1]) j++;//比较i的左右孩子,j为较大者
if(r[i]>r[j]) break;//根节点已经大于左右孩子中的较大者
else {
temp=r[i];r[i]=r[j];r[j]=temp;//将被筛结点与结点j交换
i=j;j=2*i+1;//被筛结点位于原来结点j的位置
}
}
}
void HeapSort(int r[],int n){
int i,temp;
for(i=(n-1)/2;i>=0;i--)//初始建堆,最后一个分支的下标是(n-1)/2;
SiftHeap(r,i,n);
for(i=1;i<=n-1;i++){//重复执行移走堆顶及重建堆的操作
temp=r[0];r[0]=r[n-i];r[n-i]=temp;
SiftHeap(r,0,n-i);//只需调整根节点
}
}