// Ch_IO.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#define max 4
using namespace std;
//选择排序
void select_sort(int *x,int n){
int i=0,j=0,min=0,t;
for (i=0;i<max;i++)
{
for (j=i+1;j<max;j++)
{
min=i;
if (*(x+i)>*(x+j))
{
min=j;
t=*(x+i);
*(x+i)=*(x+j);
*(x+j)=t;
}
}
}
}
//插入排序
void insert_sort(int *x,int n){
int i=0,j=0,t;
for (i=1;i<max;i++)
{
t=*(x+i);
for (j=i-1;j>=0;j--)
{
if(t<*(x+j))
{
*(x+i)=*(x+j);
*(x+j)=t;
}
}
}
}
//冒泡排序
void bubble_sort(int *x,int n){
int i=0,j=0,t;
for (i=0;i<max;i++ )
{
for (j=0;j<max-i-1;j++)
{
if (*(x+j)>*(x+j+1))
{
t=*(x+j+1);
*(x+j+1)=*(x+j);
*(x+j)=t;
}
}
}
}
//希尔排序
void shell_sort(int *x,int n){
int h,j,k,t;
for (h=n/2;h<n;h=h/2)
{
for (j=h;j<n;j++)
{
t=*(x+j);
for (k=j-h;k>=0&&*(x+j)<*(x+k);k-=h)
{
*(x+j)=*(x+k);
}
*(x+j)=t;
}
}
}
//快速排序
void quick_sort(int *x,int low,int high){
int i=low,j=high,t=*(x+low);
if (low<high)
{
while (i<j)
{
while(i<j&&t<=*(x+j))
{
j--;
}
if (i<j)
{
*(x+i)=*(x+j);
i++;
}
while(i<j&&t>=*(x+i))
{
i++;
}
if (i<j)
{
*(x+j)=*(x+i);
j--;
}
}
*(x+i)=t;
quick_sort(x,low,i-1);
quick_sort(x,i+1,high);
}
}
//堆排序
void sift(int *x,int n,int s){//要保证以s为根的下面所有节点都是大根堆
int t,k,j;
t=*(x+s);//暂时存储开始元素
k=s;//开始元素的下标
j=2*k+1;//左子树元素下标,从零开始的,注意
while (j<n)
{if (j<n-1&&*(x+j)<*(x+j+1))//判断是否满足对的条件:满足就继续下一轮的比较,否则调整
{
j++;
}
if (t<*(x+j))//调整
{
*(x+k)=*(x+j);
k=j;//往下继续调整,保证为大根堆
j=2*k+1;
}
else//不再需要调整,退出循环
{
break;
}
}
*(x+k)=t;//开始元素放到它的正确位置
}
void heap_sort(int *x,int n){
int i,k,t;
for (i=n/2-1;i>=0;i--)//从倒数第一个非叶子结点自下而上堆化
{
sift(x,n,i);//初始建堆
}
for (k=n-1;k>=1;k--)
{
t=*(x+0);//堆顶与最后一个进行交换
*(x+0)=*(x+k);
*(x+k)=t;
sift(x,k,0);//剩下的数再次重新建堆
}
}
//主函数
int _tmain(int argc, _TCHAR* argv[])
{
//输入排序数值
int *p,a[max];
p=a;
for (int i=0;i<max;i++)
{
cin>>*(p++);
}
p=a;
//测试排序
//select_sort(p,max);
//insert_sort(p,max);
//bubble_sort(p,max);
//select_sort(p,max);
//quick_sort(p,0,max-1);
heap_sort(p,max);
for (int i=0;i<max;i++)
{
cout<<*(p++)<<" ";
}
cout<<endl;
system("pause");
return 0;
}
排序算法实现
最新推荐文章于 2024-04-28 05:00:00 发布