void bubble_sort(int a[],int len){
int temp;
for(int i=0;i<len-1;i++){
for(int j=0;j<len-i-1;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
void selection_sort(int a[],int len){
int temp;
for(int i=0;i<len-1;i++){
int min=i;
for(j=i+1;i<len;j++){
if(a[j]<a[min]){
min=j;
}
}
if(min!=i){
temp=a[min];
a[min]=a[i];
a[i]=temp;
}
}
}
void insertion_sort(int a[],int len){
int temp;
for(int i=1;i<len;i++){
temp=a[i];
for(int j=i;j>0&&a[j-1]>temp;j--){
a[j]=a[j-1];
}
a[j]=temp;
}
}
void shell_sort(int a[],int len){
int temp;
for(int gap=len>>1;gap>0;gap=gap>>1){
for(int i=gap;i<len;i++){
temp=a[i];
for(int j=i-gap;j>=0&&a[j]>temp;j-=gap){
a[j+gap]=a[j];
}
arr[j+gap]=temp;
}
}
}
void merge_sort_recursive(int arr[],int reg[],int start,int end){
if(start>=end)
return;
int len=end-start,mid=(len>>1)+start;
int start1=start,end1=mid;
int start2=mid+1,end2=end;
merge_sort_recursive(arr,reg,start1,end1);
merge_sort_recursive(arr,reg,start2,end2);
int k=start;
while(start1<=end1&&start2<=end2)
reg[k++]=arr[start1]<arr[start2]?arr[start1++]:arr[start2++];
while(start1<=end1)
reg[k++]=arr[start1++];
while(start2<=end2)
reg[k++]=arr[start2++];
for(k=start;k<=end;k++)
arr[k]=reg[k];
}
void merge_sort(int arr[],const int len){
int reg[len];
merge_sort_recursive(arr,reg,0,len-1);
}
void swap(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}
void quick_sort_recursive(int arr[], int start, int end) {
if (start >= end)
return;
int mid = arr[end];
int left = start, right = end - 1;
while (left < right) {
while (arr[left] < mid && left < right)
left++;
while (arr[right] >= mid && left < right)
right--;
swap(&arr[left], &arr[right]);
}
if (arr[left] >= arr[end])
swap(&arr[left], &arr[end]);
else
left++;
if (left)
quick_sort_recursive(arr, start, left - 1);
quick_sort_recursive(arr, left + 1, end);
}
void quick_sort(int arr[], int len) {
quick_sort_recursive(arr, 0, len - 1);
}