快速排序
import java.util.*;
import java.math.*;
import java.io.*;
import java.text.*;
public class Main
{
public static void Partition(int array[], int lower, int upper)
{
int mid=array[(lower+upper)>>1];
int pointer1=lower,pointer2=upper;
do
{
while(array[pointer1]<mid)
pointer1++;
while(array[pointer2]>mid)
pointer2--;
if(pointer1<=pointer2)
{
int tmp;
tmp=array[pointer1];
array[pointer1]=array[pointer2];
array[pointer2]=tmp;
pointer1++;
pointer2--;
}
}while(pointer1<=pointer2);
if(lower<pointer2)
Partition(array, lower, pointer2);
if(pointer1<upper)
Partition(array, pointer1, upper);
}
public static void main(String args[]) throws IOException
{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String tmp = bf.readLine();
int n = Integer.parseInt(tmp);
tmp = bf.readLine();
String tmps[]=tmp.trim().split(" ");
int arrays[] = new int[500000];
for (int i = 1; i <= n; i++)
arrays[i] = Integer.parseInt(tmps[i - 1]);
Partition(arrays, 1, n);
for (int i = 1; i <= n; i++)
System.out.print(arrays[i] + " ");
System.out.println("");
bf.close();
}
}
归并排序
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.math.*;
public class Main4
{
static int tempContainer[]=new int[550000];
static int array[]=new int[550000];
static long ans=0;
public static void MergeSort(int array[],int lower,int upper)
{
if(lower>=upper)
return ;
int mid=(lower+upper)>>1;
MergeSort(array, lower, mid);
MergeSort(array, mid+1, upper);
int pointer1=lower,pointer2=mid+1,cnt=lower;
while(pointer1<=mid&&pointer2<=upper)
{
if(array[pointer1]<=array[pointer2])
tempContainer[cnt++]=array[pointer1++];
else
{
tempContainer[cnt++]=array[pointer2++];
ans+=mid-pointer1+1;//逆序数
}
}
while(pointer1<=mid)
tempContainer[cnt++]=array[pointer1++];
while(pointer2<=upper)
tempContainer[cnt++]=array[pointer2++];
for(int i=lower;i<=upper;i++)
array[i]=tempContainer[i];
}
public static void main(String args[])throws IOException
{
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
String tmp=bf.readLine();
int n=Integer.parseInt(tmp);
tmp=bf.readLine();
String tmps[]=tmp.trim().split(" ");
for(int i=1;i<=n;i++)
array[i]=Integer.parseInt(tmps[i-1]);
MergeSort(array, 1, n);
System.out.println(ans);
bf.close();
}
}