1、直接插入排序
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为 O(n^2),是稳定的排序方法,性能优于冒泡和简单选择排序
C实现
#include <stdio.h>
int n, arr[100];
void insertSort(int * arr)
{
int i,j,key;
for(i=2;i<=n;i++)
{
key=arr[i];
j=i-1;
while(j>=0&&arr[j]>key)
{
arr[j+1]=arr[j];
j--;
}
arr[j+1]=key;
}
}
int main(int argc,char * argv[])
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&arr[i]);
insertSort(arr);
for(i=1;i<=n;i++)
printf("%d ",arr[i]);
printf("\n");
return 0;
}
python 实现
#直接插入排序
def insert_sort(lists):
n=len(lists)
for i in range(1,n):
key=lists[i]
j=i-1
while(j>=0 and lists[j]>key):
lists[j+1]=lists[j]
j-=1
lists[j+1]=key
if __name__=='__main__':
eles = input('intput elements:').strip().split()
list = [int(ele) for ele in eles]
insert_sort(list)
print(list)
2、希尔排序
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
思想:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的。
C实现
#include <stdio.h>
void shellSort(int arr[],int n)
{
int i,j,step,key,k;
for(step=n/2;step>0;step/=2) //分组,增量逐渐减小,即分组逐渐减少
{
for(i=1;i<=step;i++) //分成的子组分别进行直接插入操作
for(j=step+i;j<=n;j+=step)
{
key=arr[j];
k=j-step;
while(k>0&&arr[k]>key)
{
arr[k+step]=arr[k];
k-=step;
}
arr[k+step]=key;
}
}
}
int main()
{
int i,n, arr[100];
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&arr[i]);
shellSort(arr,n);
for(i=1;i<=n;i++)
printf("%d ",arr[i]);
printf("\n");
return 0;
}
python 实现
def shell_sort(lists):
n=len(lists)
gap=n//2
while gap>0:
for i in range(gap):
for j in range(i+gap,n,gap):
key = lists[j]
k=j-gap
while k>=0 and lists[k]>key:
lists[k+gap]=lists[k]
k-=gap
lists[k+gap]=key
gap//=2
return lists
if __name__=='__main__':
eles = input('intput elements:').strip().split()
list = [int(ele) for ele in eles]
list=shell_sort(list)
print(list)