插入排序

插入排序經常使用的兩種實現方法有直接插入排序,希爾排序。數組

有一個已經有序的數據序列,要求在這個已經排好的數據序列中插入一個數,但要求插入後此數據序列仍然有序,這個時候就要用到一種新的排序方法——插入排序法spa

NO.1 直接插入排序3d

void InsertSort(int a[], int n) {
  for (int i = 1; i < n; i++) {
    if (a[i] < a[i-1]) {//若第i個元素大於i-1,直接插入,反之則移動有序表後插入 
      int j = i-1;
      int temp = a[i];//複製爲哨兵,即存儲待排序元素 
      while ( j >= 0 && temp < a[j]) {//查找在有序表的插入位置 
        a[j+1] = a[j];
        j--;//元素後移 
      }
      a[j+1] = temp;//插入到正確位置 
    }
  }
}

NO.2 希爾排序code

和直接插入排序不一樣的是,希爾排序利用增量,對兩個間隔爲增量長度的數據進行直接插入排序。blog

void ShellInsertSort(int a[], int n, int flag) {
  for (int i = flag; i < n; i++) {
    if (a[i] < a[i-flag]) {//若第i個元素大於i-1,直接插入,反之則移動有序表後插入 
      int j = i-flag;
      int temp = a[i];//複製爲哨兵,即存儲待排序元素 
      while (j >= 0 && temp < a[j]) {//查找在有序表的插入位置 
        a[j+flag] = a[j];
        j -= flag;//元素後移 
      }
      a[j+flag] = temp;//插入到正確位置 
    }
  }
}
void ShellSort(int a[], int n) {
  int flag = n / 2;//初始增量爲數組長度的一半 
  while (flag >= 1) {
    ShellInsertSort(a, n, flag);
    flag /= 2;//增量減少爲一半 
  }
}
相關文章
相關標籤/搜索