POJ 2388 Who's in the Middle
2012-03-01 14:13 咆哮的马甲 阅读(429) 评论(0) 编辑 收藏 举报今天恰好在总结各种排序算法,在POJ上找到这样一道水题找到给定乱序数组的中间值。
直接插入排序解法
#include <iostream>
using namespace std;
int cow[1000000];
void swap(int &a, int &b)
{
if(a == b)
return;
a = a^b;
b = b^a;
a = a^b;
}
int main()
{
int n = 0;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>cow[i];
}
for(int i=1; i<n; i++)
{
int cur = i;
while(cur != 0 && cow[cur-1]>cow[cur])
{
swap(cow[cur-1],cow[cur]);
cur--;
}
}
cout<<cow[n/2];
return 0;
}
冒泡排序解法
#include <iostream>
using namespace std;
int cow[1000000];
void swap(int &a, int &b)
{
if(a == b)
return;
a = a^b;
b = b^a;
a = a^b;
}
int main()
{
int n = 0;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>cow[i];
}
for(int i=n-1; i>0; i--)
{
bool flag = true;
for(int j=0; j<i; j++)
{
if(cow[j] > cow[j+1])
{
swap(cow[j],cow[j+1]);
flag = false;
}
}
if(flag)
{
break; // improve performance.
}
}
cout<<cow[n/2];
return 0;
}
选择排序
#include <iostream>
using namespace std;
int cow[1000000];
void swap(int &a, int &b)
{
if(a == b)
return;
a = a^b;
b = b^a;
a = a^b;
}
int main()
{
int n = 0;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>cow[i];
}
for(int i=0; i<n; i++)
{
int min = i;
for(int j=i+1; j<n; j++)
{
if(cow[min]>cow[j])
{
min = j;
}
}
swap(cow[i],cow[min]);
}
cout<<cow[n/2];
return 0;
}
快速排序
#include <iostream>
using namespace std;
int cow[1000000];
void swap(int &a, int &b)
{
if(a == b)
return;
a = a^b;
b = b^a;
a = a^b;
}
int partition(int cows[], int l, int r)
{
int pivot = cows[l];
while(l<r)
{
while(l<r && pivot<=cows[r])
{
r--;
}
if(l<r)
{
swap(cow[l],cow[r]);
l++;
}
while(l<r && pivot>=cows[l])
{
l++;
}
if(l<r)
{
swap(cow[l],cow[r]);
r--;
}
}
cows[l] = pivot;
return l;
}
void QuickSort(int cows[], int l, int r)
{
if(l<r)
{
int i = partition(cows,l,r);
QuickSort(cows,l,i-1);
QuickSort(cows,i+1,r);
}
}
int main()
{
int n = 0;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>cow[i];
}
QuickSort(cow,0,n-1);
cout<<cow[n/2];
return 0;
}
原地快速排序
#include <iostream>
using namespace std;
int cow[1000000];
void swap(int &a, int &b)
{
if(a == b)
return;
a = a^b;
b = b^a;
a = a^b;
}
int inPlacePartition(int cows[], int l, int r)
{
int pos = l;
int pivotValue = cows[pos];
swap(cows[pos],cows[r]);
for(int i=l; i<r; i++)
{
if(cows[i] < pivotValue)
{
swap(cows[i],cows[pos++]);
}
}
swap(cows[pos],cows[r]);
return pos;
}
void quickSort(int cows[], int l, int r)
{
if(l >= r)
return;
else
{
int pos = inPlacePartition(cows,l,r);
quickSort(cows,l,pos-1);
quickSort(cows,pos+1,r);
}
}
int main()
{
int n = 0;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>cow[i];
}
quickSort(cow,0,n-1);
cout<<cow[n/2];
return 0;
}
作者:咆哮的马甲
出处:http://www.cnblogs.com/arthurliu/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
转载请保持文档的完整性,严禁用于任何商业用途,否则保留追究法律责任的权利。