插入排序`
/插入排序
#include<stdio.h>
int main()
{
int Insert[9]={3,2,5,9,66,19,22,80,-100};
int i,temp;
for(i=1;i<9;i++)
{
temp =Insert[i];
if(Insert[i]<Insert[i-1])
{
for(int j=i-1;j>=0&&Insert[j]>temp;j--)
{
Insert[j+1]=Insert[j];
Insert[j]=temp;
}
}
}
for(i=0;i<9;i++)
{
printf("%d ",Insert[i]);
}
printf("\n");
}
归并排序
//归并排序
#include<stdio.h>
#include<stdlib.h>
void print_arr(int arr[],int n)
{
for(int i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
//合并
void merge(int arr[],int tempArr[],int left,int mid,int right)
{
//标记左半区域第一个未排序的元素
int l_pos = left;
//标记右半区域第一个未排序的元素
int r_pos = mid+1;
//临时数组元素的下标
int pos = left;
//合并
while(l_pos<=mid &&r_pos<=right)
{
if(arr[l_pos]<arr[r_pos])
{
tempArr[pos++] = arr[l_pos++];
}
else
tempArr[pos++]=arr[r_pos++];
}
//合并左半区域剩余元素
while(l_pos<=mid)
tempArr[pos++]=arr[l_pos++];
//合并右半区域剩余元素
while(r_pos<=right)
tempArr[pos++]=arr[r_pos++];
//把临时数组中合并后的元素复制回原来的数组
while(left<=right)
{
arr[left]=tempArr[left];
left++;
}
}
//归并排序
void msort(int arr[],int tempArr[],int left,int right)
{
//如果只有一个元素,那么不需要继续划分
//只有一个元素的区域,本来就是有序的只需要被归并
if(left<right)
{
//找中间点
int mid =(left+right)/2;
//递归划分左半区域
msort(arr,tempArr,left,mid);
//递归划分右半区域
msort(arr,tempArr,mid+1,right);
//合并已经排序部分
merge(arr,tempArr,left,mid,right);
}
}
//归并排序入口
void merge_sort(int arr[],int n)
{
//分配一个辅助数组
int *tempArr = (int*)malloc (n*sizeof(int)) ;
if(tempArr) //如果它不等于空,辅助数组分配成功
{
msort(arr,tempArr,0,n-1);
free(tempArr);
}
else{
printf("error");
}
}
int main()
{
int arr[]={9,5,2,7,12,4,3,1,11};
int n=9;
print_arr(arr,n);
merge_sort(arr,n);
print_arr(arr,n);
return 0;
}