1.直接插入排序
《算法导论》P10,《数据结构》P265
向已经排好序的数组a[1..j-1]插入a[j],进行一趟循环遍历。插入排序的基本操作是在一个有序表进行查找和插入。每一趟插入排序从后往前进行比较,便于数组中元素的向后移动。
空间复杂度:O(1)(当使用swap交换时,可实现原址)
时间复杂度:(n^2)/4
即O(n^2)
2.拓展
1)折半查找排序
插入排序的基本操作是在一个有序表进行查找和插入。由查询故可以想到“二分查找”即折半查找,通过折半查找找到插入位置,再操作数组插入
代码:
//插入排序 public class Insert_Sort { //直接插入排序 public void InsertSort(int[] data) { if((data != null)&&(data.length > 0)) { for(int i = 1;i < data.length; i ++) { int key = data[i];//记录下当前需要插入的数字,作为哨兵 int index = i - 1;//记录哨兵最终要插入的位置 //一直循环找到第一个比key小的位置 while((index > 0)&&(data[index] > key)) { //后移数组 data[index + 1] = data[index]; index --; } //将哨兵插入 data[index + 1] = key; } } } //直接插入排序实现方法二 public void InsertSort2(int[] data) { if((data != null)&&(data.length > 0)) { for(int i = 1;i < data.length; i ++) { int key = data[i];//记录下当前需要插入的数字,作为哨兵 int index = i - 1;//记录哨兵最终要插入的位置 //一直循环找到第一个比key小的位置 while((index > 0)&&(data[index] > key)) { //直接交换数据,即将要插入的值通过不断往前交换,插入到合适的值 swap(data, index + 1, index); index --; } } } } //折半插入排序 public void BinaryInsertSort(int[] data) { if((data != null)&&(data.length > 0)) { for(int i = 1;i < data.length; i ++) { int key = data[i];//记录下当前需要插入的数字,作为哨兵 int start = 0; int end = i - 1; //二分查找 while(start < end) { int mid = (start + end) / 2; if(data[mid] > key)//插入点在前半段 { end = mid - 1; } else if(data[mid] < key)//插入点在后半段 { start = mid + 1; } else //相等即找到插入点 { start = end = mid; } } //移动数组插入,注意要从后往前移动,且此时start=mid for(int j = i - 1; j > end; j--) { data[j + 1] = data[j]; } data[end + 1] = key; } } } private void swap(int[] data , int a, int b) { int temp = data[a]; data[a] = data[b]; data[b] = temp; } public static void main(String[] args) { int data[] = {2,34,45,2,13,24,5,24,57}; Insert_Sort insert_Sort = new Insert_Sort(); insert_Sort.BinaryInsertSort(data); Main.print_array(data); } }
时间: 2024-10-12 12:40:46