快速排序
void exchange_two_num(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
int PARTITION(int* arr,int start,int end)
{
int flag=-1;
int i;
for(i=0;i<end-1;i++)
{
if(arr[i]<=arr[end-1])
{
flag=flag+1;
exchange_two_num(&arr[flag],&arr[i]);
}
}
exchange_two_num(&arr[flag+1],&arr[end-1]);
return flag+1;
}
void QUICK_SORT(int* arr,int start,int end)
{
if(start<end)
{
int mid=PARTITION(arr,start,end);
QUICK_SORT(arr,start,mid);
QUICK_SORT(arr,mid+1,end);
}
}
归并排序
void MERGE(int *arr, int first, int middle, int last)
{
int left_length=middle+1-first;
int right_length=last-middle;
int i,j,m;
int *left=(int*)malloc((left_length+1)* sizeof(int));
int *right=(int*)malloc((right_length+1)* sizeof(int));
for(i=0;i<left_length;i++)
{
left[i]=arr[first + i];
}
for(j=0;j<right_length;j++)
{
right[j]=arr[middle + 1 + j];
}
left[left_length]=INT_MAX;
right[right_length]=INT_MAX;
j=i=0;
for(m=0;m<left_length+right_length;m++)
{
if(left[i]<right[j])
{
arr[first + i + j]=left[i];
i++;
}
else
{
arr[first + i + j]=right[j];
j++;
}
}
free(left);
free(right);
}
void MERGE_SORT(int *arr, int first, int last)
{
int middle;
if(first<last)
{
middle=(first+last)/2;
MERGE_SORT(arr, first, middle);
MERGE_SORT(arr, middle + 1, last);
MERGE(arr, first, middle, last);
}
}
堆排序
void MAX_HEAPIFY(int *A,int i,int length)
{
int lchild= 2 * i + 1;
int rchild= 2 * i + 2;
int largest;
if(lchild <= length-1 && A[lchild] > A[i])
{
largest=lchild;
}
else
{
largest=i;
}
if(rchild <= length-1 && A[rchild] > A[largest])
{
largest=rchild;
}
if(largest!=i)
{
int temp=A[i];
A[i]=A[largest];
A[largest]=temp;
MAX_HEAPIFY(A,largest,length);
}
}
void BUILD_MAX_HEAP(int *A,int length)
{
for(int i= (length-2)/2;i>=0;i--)
MAX_HEAPIFY(A,i,length);
}
void HEAPSORT(int *A,int length)
{
BUILD_MAX_HEAP(A,length);
for(int i=length-1;i>=0;i--)
{
int temp=A[0];
A[0]=A[i];
A[i]=temp;
MAX_HEAPIFY(A,0,i);
}
}