总:
插入排序: 直接插入 希尔排序
交换排序: 冒泡排序 快速排序
选择排序:直接选择 堆排序
归并排序
桶排序
一、直接插入排序
- 从第一个元素起,将该元素认为是已排序的
- 取出下一个元素,在已排序好的元素序列中从后向前扫描
- 如果该元素(已排序)的元素大于新的元素,将该元素移动到下一个位置
- 重复 3 ,直到找到已排序元素小于或者等于新元素的值
- 将新元素插入到该位置(已排序元素)之后
- 重复 2~5 ,直到将元素排序完成
#include<stdio.h>
void Show(int *arr, int len)
{
for(int i = 0;i<len;i++)
{printf("%d ",arr[i]);
}
printf("\n");
}
void InsertSort(int *arr,int len)
{
int i=1;
for(i; i< len;i++)
{
int tmp = arr[i];
int j = i - 1;
while(j>0 && arr[j]>tmp)
{arr[j+1]=arr[j];
j--;
}arr[j+1]=tmp;
}
}int main()
{
int arr[]={1,5,7,8,6,3,2,4};
int len=sizeof(arr)/sizeof(arr[0]);
InserSort(arr,len);Show(arr,len);
return 0;
}
二、希尔排序(插入排序的更高改进)
- 先将数据分组,然后组内有序
- 再分组,分组数量小于上次分组,再组内有序
- 重复2 ,直至组为1
PS:增量互为质数,每一组之间排序都用插入排序
#include<stdio.h>
void Show(int arr[],int len)
{
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void ShellSort(int arr[],int len)
{
int i;int j;
int gap; //组距
for(gap=len/2;gap>0;gap/=2)
{
for(i = gap;i<len;i++)
{
int tmp = arr[i]; //哨兵
for(j = i-gap;j>=0&&arr[j]>tmp;j-=gap)
{
arr[j+gap]=arr[j];
}
arr[j+gap]=tmp;
}
}}
int main()
{
int arr[]={1,2,3,5,6,7,8,9,52,26};
int len=sizeof(arr)/sizeof(arr[0]);
ShellSort(arr,len);
Show(arr,len);
return 0;
}
TIPS: