插入排序

插入排序

我只是一个虾纸丫 提交于 2019-11-26 13:59:00
和选择很像,都分为有序区和无序区。选择排序是每次从无序区中找到最小元素放到有序区末尾,而插入是将数组第一个元素作为有序区,每次从无序区中拿出第一个元素插入到有序区中合适的位置,直到无序区空。初始有序区0,无序区[1,n-1] 分析 最好:T(n)=o(n),数组元素正序排列 最坏:T(n)=o(n^2)数组元素反序排列 平均:T(n)=o(n^2) 代码 先用个临时变量存储无序区第一个元素,然后比较排序。 class Solution{ public://起初有序区[0],无序区[1,n-1] void sort(int arr[],int len){ for(int i=1;i<len;i++){ int tmp = arr[1]; int j = i-1;//代表有序区最有一个元素位置 while(j>=0 && arr[j]>tmp){ arr[j+1] = arr[j]; j--; } arr[j+1] = tmp;//j+1是空的 } } } 来源: https://www.cnblogs.com/pacino12134/p/11323048.html

排序算法---插入排序

試著忘記壹切 提交于 2019-11-26 12:25:06
1.直接插入排序 1 void insetSort(int *arr, int n) 2 { 3 int i, j, k; 4 5 for(i = 1; i < n; i++) 6 { 7 for(j = i - 1; j >= 0; j--) 8 { 9 if(arr[j] < arr[i]) 10 { 11 break; 12 } 13 } 14 15 if(j != i - 1) 16 { 17 int temp = arr[i]; 18 19 for(k = i - 1; k > j; k--) 20 { 21 arr[k + 1] = arr[k]; 22 } 23 24 arr[k + 1] = temp; 25 } 26 } 27 } 2.希尔排序 1 void insetSort(int *arr, int n, int dk) 2 { 3 int i, j, k; 4 5 for(i = dk; i < n; i++) 6 { 7 for(j = i - dk; j >= 0; j -= dk) 8 { 9 if(arr[j] < arr[i]) 10 { 11 break; 12 } 13 } 14 15 if(j != i - dk) 16 { 17 int temp = arr[i]; 18 19 for(k = i - dk; k > j; k -= dk

排序算法:插入排序

為{幸葍}努か 提交于 2019-11-26 05:42:27
介绍 排序思想 1.从第一个元素开始,该元素可认为已排序。 2.取出下一个元素,在排序好的元素序列中从后往前扫描 3.如果元素(已排序)大于新元素,将该元素移到下一位置 4.重复3.直到找到已排序的元素小于或等于新元素的位置 5.将新元素插入该位置后 6.重复2-5直到排序完成 默认第一个已排序 从剩余的未排序元素中拿取第一个元素 按顺序插入已排序队列 来源: CSDN 作者: DreamCloud712 链接: https://blog.csdn.net/DreamCloud714/article/details/103241404

排序——选择排序、插入排序、冒泡排序、归并排序

半城伤御伤魂 提交于 2019-11-26 03:42:44
import math def select_sort(lists): """选择排序""" count = len(lists) for i in range(count): min = i for j in range(i+1,count): if lists[min] > lists[j]: min = j lists[i],lists[min] = lists[min], lists[i] return lists def insert_sort(lists): """插入排序""" count = len(lists) for i in range(1, count): key = lists[i] j = i-1 while j >= 0: if lists[j] > key: lists[j+1] = lists[j] lists[j] = key j -= 1 return lists def bubble_sort(lists): """冒泡排序""" count = len(lists) for i in range(count-1): for j in range(count-1-i): if lists[j] > lists[j+1]: lists[j], lists[j+1] = lists[j+1], lists[j] return lists def

插入排序

雨燕双飞 提交于 2019-11-26 02:39:35
一、基本思想 (直接插入排序) 1.把整个区间分为“有序”和“无序”。 2.每次选择无序区间内的第一个元素插入到有序区间的合适位置。 二、性能分析 选择排序是一种稳定性较好的算法。 空间复杂度为O(1)。 数据有序时,时间复杂度最好,O(N); 数据逆序时,时间复杂度最坏,O(N^2); 平均时间复杂度为O(N^2)。 插入排序的初始数据越接近有序,时间效率越高。 三、代码实现 //插入排序,升序为例 public static void insertSort ( int [ ] array ) { //bound变量来把整个数组分成两个区间 //[0, bound) 已排序区间 //[bound, size) 待排序区间 for ( int bound = 1 ; bound < array . length ; bound ++ ) { //bound 下标对应的元素就是待插入元素 //把这个元素放到前面的有序顺序表中的合适位置 int tmp = array [ bound ] ; int cur = bound - 1 ; for ( cur = bound - 1 ; cur >= 0 ; cur -- ) { if ( array [ cur ] > tmp ) { array [ cur + 1 ] = array [ cur ] ; } else { break ;

go 冒泡/选择/快速/插入排序

早过忘川 提交于 2019-11-25 22:26:19
package sort //冒泡排序 func BubbleSort(arr[]int)[]int{ var temp int if len(arr) <=1{ return arr } for j :=len(arr);j>0;j--{ for i :=0;i<len(arr);i++{ if arr[i]>arr[i+1]{ swap(arr,i,i+1) } } } return arr } //选择排序 func SelectSort(arr []int)[]int{ if len(arr) <=1{ return arr } for j :=len(arr);j>0;j--{ max :=0 for i :=1;i<len(arr);i++{ if arr[i]>arr[max]{ max = i } } swap(arr,max,j-1) } } //快速排序 func QuickSort(arr[]int) []int{ if len(arr)<=1{ return arr } mid :=arr[0] head,tail :=0,len(arr)-1 for i :=1;i<tail{ if arr[i]>mid{ arr[i],arr[tail]=arr[tail],arr[i] tail-- }else{ arr[i],arr[head]=arr[head]

排序学习笔记

风流意气都作罢 提交于 2019-11-25 21:49:21
文章目录 1、如何分析一个“排序算法”? 1.1 排序算法的执行效率 1.2 排序算法的内存消耗 1.3 排序算法的稳定性 2、复杂度O(n2)的排序 2.1 冒泡排序(Bubble Sort) 2.2 插入排序(Insertion Sort) 2.3 选择排序(Selection Sort) 2.4 三种排序对比图 2.5 为什么插入排序要比冒泡排序更受欢迎呢? 3、复杂度O(nlogn)的排序 3.1 归并排序 3.2 快速排序 3.3 三种比较 4、复杂度O(n)的排序 4.1 桶排序(Bucket sort) 4.2 计数排序(Counting sort) 4.3 基数排序(Radix sort) 1、如何分析一个“排序算法”? 1.1 排序算法的执行效率 最好情况、最坏情况、平均情况时间复杂度 时间复杂度的系数、常数 、低阶 比较次数和交换(或移动)次数 1.2 排序算法的内存消耗 1.3 排序算法的稳定性 ​ 如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。 2、复杂度O(n2)的排序 2.1 冒泡排序(Bubble Sort) // 冒泡排序,a 表示数组,n 表示数组大小 public void bubbleSort ( int [ ] a , int n ) { if ( n <= 1 ) return ; for ( int i