【大话数据结构算法】直接插入排序
生活随笔
收集整理的這篇文章主要介紹了
【大话数据结构算法】直接插入排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
直接插入排序的基本思想:每趟將一個待排元素作為關鍵字,按照其關鍵字值得大小插入到已經排好序的部分序列的適當位置,直到插入完成。
算法思想總結如下:(設待排序的數組為a[0…n-1])
1、初始時,a[0]就是第一個有序區間,無序區間為a[1…n-1];
2、將a[i]并入當前的有序區a[0…i-1]中形成a[0…i]的有序區間;
3、i++并重復第二步,知道i=n-1,此時排序完成。
直接插入排序基本算法實現如下:
void insertSort1(int[] a,int n){int i,j,temp;//第一個元素有序,所以從第二個開始處理for (i = 1; i < n; i++) {temp = a[i];//將待排元素暫存于temp中j = i - 1;//從待排元素之前的元素開始掃描,如果大于待排元素,則后移一位while(j >= 0 && a[j] > temp){a[j + 1] = a[j];j--;}//找到插入位置,將temp中暫存的待排元素插入a[j + 1] = temp;}}java代碼實現如下:
public class InsertSort {public static void main(String[] args) {int[] a = {5,2,9,6,8,4,3,0};insertSort1(a,8);for (int i = 0; i < a.length; i++) {System.out.println(a[i]);}System.out.println("**************");int[] b = {5,2,9,6,8,4,3,0};insertSort2(b,8);for (int i = 0; i < b.length; i++) {System.out.println(b[i]);}}public static void insertSort1(int[] a,int n){int i,j,temp;//第一個元素有序,所以從第二個開始處理for (i = 1; i < n; i++) {temp = a[i];//將待排元素暫存于temp中j = i - 1;//從待排元素之前的元素開始掃描,如果大于待排元素,則后移一位while(j >= 0 && a[j] > temp){a[j + 1] = a[j];j--;}//找到插入位置,將temp中暫存的待排元素插入a[j + 1] = temp;}}public static void insertSort2(int[] a, int n){int i,j;for (i = 1; i < n; i++) {if (a[i] < a[i-1]) {int temp = a[i];for (j = i-1; j >= 0 && a[j] > temp; j--) {a[j+1] = a[j];}a[j+1] = temp;}}} }時間復雜度:
考慮最壞的情況,即整個序列式逆序的,則內層循環temp < a[j]這個條件是始終成立的。此時,對于每一次外層循環,最內層循環的執行次數(也就是基本操作a[j+1] = a[j] 的執行次數)達到最大值,為i次,i的取值范圍為2~n,由此可得基本操作總的執行次數為n(n-1)/2,時間復雜度為O(n2){n的平方}。
考慮最好的情況,即整個序列已經是有序序列,則對于內層循環temp < a[j]這個條件是始終不成立的。此時內層循環始終不執行,時間復雜度為**重點內容**0(n)。
空間復雜度:
由算法代碼可知,算法所需的額外空間只有一個temp,因此它的空間復雜度為0(1)。
總結
以上是生活随笔為你收集整理的【大话数据结构算法】直接插入排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【大话数据结构算法】希尔排序
- 下一篇: 【大话数据结构算法】直接选择排序