代码改变世界

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;
}