常见排序算法(C语言)
1、直接插入排序
void InsertSort(int *a,int length)
{
int i,j,temp;
for(i=1;i<length;i++)
{
temp = a[i];
for(j=i-1;j>=0;j--)
{
if(temp < a[j])
{
a[j+1] = a[j];
}
else
break;
}
a[j+1] = temp;
}
}
巧记
for一个成员放temp
小弟来交换,还要再循环
大哥就罚站
2、希尔排序
void ShellSort(int *a,int length)
{
int i,j,h,temp;
for(h=length/2;h>0;h/=2)
{
for(i=h;i<length;i++)
{
temp = a[i];
for(j=i-h;j>=0;j-=h)
{
if(temp < a[j])
a[j+h] = a[j];
else
break;
}
a[j+h] = temp;
}
}
}
3、冒泡排序
void BubbleSort(int *a,int length)
{
int temp;
for(int i=0;i<length-1;i++)
{
for(int j=0;j<length-1-i;j++)
{
if(a[j+1] < a[j])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
4、快速排序
void QuickSort(int *a,int start,int end)
{
if(start>=end)
return;
int x = start;
int y = end;
int base = a[start];
while(x<y)
{
while(a[y] > base && x<y)
{
y--;
}
if(x < y)
{
a[x++] = a[y];
}
while(a[x] < base && x<y)
{
x++;
}
if(x < y)
{
a[y--] = a[x];
}
a[x] = base;
QuickSort(a,start,x-1);
QuickSort(a,x+1,end);
}
}
巧记
你比我小我向前(y–)
你比我大我给它(a[x]=a[y])
它无办法向后挪
重合以后劫base
你去调来我也调
5、简单选择排序
void SelectSort(int *a,int length)
{
int min;
for(int i=0;i<length;i++)
{
min = i;
for(int j=i+1;j<length;j++)
{
if(a[min] > a[j])
{
min = j;
}
}
int temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
巧记
循环最小我记号
原始位置变最小
然后就是下一位
6、归并排序
排序入口
void MergeSort(int arry[] , int n)
{
//分配一个辅助数组
int *tempArr = (int*)malloc(n * sizeof(int));
if(tempArr)//分配成功
{
msort(arry,tempArr,0,n-1);
free(tempArr);
}
else
{
printf("error: faild to allocate memory");
}
}
划分
void msort(int arry[],int tempArr[],int left,int right)
{
//如果只有一个元素无需划分,只需要归并
if(left < right)
{
//划分数组为左右两个部分
int mid = (left + right) / 2;
//左半部分
msort(arry,tempArr,left,mid);
//右半部分
msort(arry,tempArr,mid+1,right);
//归并算法
merge(arry,tempArr,left,mid,right);
}
}
合并
void merge(int arry[],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(arry[l_pos] < arry[r_pos])
tempArr[pos++] = arry[l_pos++];
else
tempArr[pos++] = arry[r_pos++];
}
//合并左半区剩余元素
while(l_pos <= mid)
tempArr[pos++] = arry[l_pos++];
//合并右半区剩余元素
while(r_pos <= right)
tempArr[pos++] = arry[r_pos++];
//最后把临时数组中排好的元素复制回原来的数组
while(left <= right)
{
arry[left] = tempArr[left];
left++;
}
}
9、输出函数
void ScanArray(int *a,int length)
{
for(int i=0 ; i<length ; i++)
{
printf("%d ",a[i]);
}
}
10、主函数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[] = {5,5,6,8,1,7,6,8,4,5,2};
int e[] = {5,5,6,8,1,7,6,8,4,5,2};
int f[] = {5,5,6,8,1,7,6,8,4,5,2};
//printf("直接插入排序;\n");
//int *b = a;
//InsertSort(b,sizeof(b) / sizeof(b[0]));
//ScanArray(b,sizeof(b) / sizeof(b[0]));
printf("希尔排序;\n");
//int *c = a;
//ShellSort(c,sizeof(a) / sizeof(a[0]));
//ScanArray(c,sizeof(a) / sizeof(a[0]));
printf("冒泡排序;\n");
int *d = a;
BubbleSort(d,sizeof(a) / sizeof(a[0]));
ScanArray(d,sizeof(a) / sizeof(a[0]));
printf("\n");
printf("快速排序;\n");
//int *e = a;
QuickSort(e,0,sizeof(a) / sizeof(a[0]) - 1);
ScanArray(e,sizeof(a) / sizeof(a[0]));
printf("\n");
printf("快速排序;\n");
SelectSort(f,sizeof(a) / sizeof(a[0]));
ScanArray(f,sizeof(a) / sizeof(a[0]));
printf("\n");
int g[] = {5,11,6,8,1,7,14,9,4,3,2};
printf("归并排序;\n");
MergeSort(g,sizeof(g) / sizeof(g[0]));
ScanArray(g,sizeof(g) / sizeof(g[0]));
printf("\n");
return 0;
}