插入算法分别从C,java,python三种语言进行书写
真正学懂计算机的人(不只是“编程匠”)都对数学有相当的造诣,既能用科学家的严谨思维来求证,也能用工程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”。
作为一个初级编程人员或者说是一个程序员,算法对其是非常重要的,个人建议,如果你是正在读相关专业的大学学生,希望能够接触一些基本的算法。就算不能熟练掌握,不能够写出优美代码,也需要了解其中思想。因为有可能在以后的某个项目中,你就会用到。这是每个程序员都需要掌握的“内功”。不学,可能就会吃亏。因为,不管在什么时候,算法都是计算机科学领域最重要的基石之一。
小编想到哪里就写到哪里,也许可能在某些地方表达的不太准确,大神不喜可以评论,但小编有个请求,也不要喷小编。
插入算法总结来说就是将由小到大进行排序或者你也可以进行由大到小进行排序。
基本原理就是,将数组中的第一个数当作是有序数列,将第 i-1个数当作无序数列,将这个有i-1的元素的数组由左至右一次判断是否比有序数列中的个数大,那就进行交换位置
下面举一个例子,例如我有一个数组tuple_count = [5,1,4,7,6],我选取这个数组中的第一个数1组成有序数组,tuple_count_first = [5],剩下的组成无序数组tuple_count_second = [1,4,7,6],之后我拿1与5进行比较,5>1,那就1与5进行交换位置,插入到相应的位置。
效率分析
如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况如下。
最好情况:序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。
最坏情况:序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。
直接插入排序属于稳定的排序,最坏时间复杂度为O(n^2),最好时间复杂度为O(n),空间复杂度为O(1)。
插入排序的赋值操作是比较操作的次数加上(n-1)次。
因此,插入排序不适合对于数据量比较大的排序应用
写书写Java的插入算法:
public static void main(String[] args) {
// TODO Auto-generated method stub
int i,j;
int [] tuple_count = {3,1,5,7,2,4,6,8,10,9};
for (i = 1; i < tuple_count.length; i++) {
// 设置数组中的第2个元素为第一次循环要插入的数据
int temp = tuple_count[i];
j = i - 1;
// 如果要插入的元素小于第j个元素,就将第j个元素向后移
while ((j >= 0) && temp < tuple_count[j]) {
tuple_count[j + 1] = tuple_count[j];
j--;
}
tuple_count[j + 1] = temp;
}
//将排序好的数组打印出来
System.out.println(Arrays.toString(tuple_count));
}
python插入算法:
Ls = [3,1,5,7,2,4,6,8,10,9]
def the_paixu(the_first_tuple):
for i in range(1,len(the_first_tuple)):
#设置数组中的第2个元素为第一次循环要插入的数据
temp = the_first_tuple[i]
j = i-1
#如果要插入的元素小于第j个元素,就将第j个元素向后移
while j>=0 and temp<the_first_tuple[j]:
the_first_tuple[j+1] = the_first_tuple[j]
j = j-1
the_first_tuple[j+1] = temp
if __name__=='__main__':
the_paixu(Ls)
print(Ls)
C语言插入算法:
#include<stdio.h>
#define n 8
void main()
{
int num[n] = { 3, 1, 5, 7, 2, 4, 6, 8 };
for (int i = 1; i < n; i++) //n为数组a元素的个数
{
int temp = num[i];
int j = i-1;
while ((j>=0) && (temp<num[j]))
{
num[j+1] = num[j];
j--;
}
num[ j+1 ] = temp;
}
for (int i = 0; i<n; i++)
{
if (i>0)
printf(",");
printf("%d", num[i]);
}
getchar();
}