1. 程式人生 > >資料結構基礎 希爾排序 之 演算法複雜度淺析

資料結構基礎 希爾排序 之 演算法複雜度淺析

/*  使用 Sedgewick增量 的 Shell Sort 程式 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 1000000	//這裡設定要對多少個元素排序
void shellsort(int A[], int N, int *);
void printarray(int A[]);
int main()
{
  int i, s[MAX];
  int *sed;
  int sedgewick[] = {		// Sedgewick增量
    1073643521, 603906049, 268386305, 150958081, 67084289,
    37730305, 16764929, 9427969, 4188161, 2354689,
    1045505, 587521, 260609, 146305, 64769,
    36289, 16001, 8929, 3905, 2161,
    929, 505, 209, 109, 41,
    19, 5, 1, 0 };		//用 0 標記終點
  for (sed = sedgewick; *sed > MAX; sed++)	// 增量必須小於元素個數
    /* void */;
  for (i = 0; i < MAX; i++)
    s[i] = 1+(int) ((float)MAX*rand()/(RAND_MAX+1.0));
  printf("before   :");
  printarray(s);
  shellsort(s, MAX, sed);
  printf("after    :");
  printarray(s);
  return 0;
}
/* Shell Sort: 把增量序列放在數組裡 */
void shellsort(int v[], int n, int *sed)
{
  int i, j, temp;
  int *gap;
  for (gap = sed; *gap > 0; gap++)
    for (i = *gap; i < n; i++)
      for (j = i - *gap; j>=0 && v[j]>v[j + *gap]; j -= *gap) {
	temp = v[j];
	v[j] = v[j + *gap];
	v[j + *gap] = temp;
      }
}
void printarray(int a[])
{
  int i;
  for (i = 0; i < MAX; i++)
    printf(" %d", a[i]);
  printf("/n");
}

// Sedgewick增量可用像下面那樣的程式求得。
/* 計算 Sedgewick增量 的程式 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define wick  100
void insertsort(int A[], int N);
void printarray(int A[], int from, int to);
int main()
{
  int i, j;
  int sedge[wick];
  i = -1;
  do {
    ++i;
    sedge[i] = 9 * pow(4,i) - 9 * pow(2,i) + 1;
    printf("sedge[%d] = %d/n", i, sedge[i]);
  } while (sedge[i] > 0);
  printf("/n");
  j = 1;
  do {
    ++j;	// j = 0 和 j = 1 時該算式的解小於0,所以從 j = 2 開始取值。
    sedge[j+i-2] = pow(4,j) - 3 * pow(2, j) + 1;
    printf("sedge[%d] = %d/n", j+i-2, sedge[j+i-2]);
  } while (sedge[j+i-2] > 0);
  printf("/n");
  printarray(sedge, 0, j+i-2);
  insertsort(sedge, j+i-2);
  printarray(sedge, 0, j+i-2);
  return 0;
}
void printarray(int a[], int from, int to)
{
  int i;
  for (i = from; i < to; i++)
    printf("%d, ", a[i]);
  printf("/n/n");
}
/* 從大到小排序 */
void insertsort(int A[], int n)
{
  int  i, j, key;
  for (j = 1; j < n; j++)
    {
      key = A[j];
      i = j - 1;
      while (i >= 0 && A[i] < key)
	{
	  A[i+1] = A[i];
	  --i;
	}
      A[i+1] = key;
    }
}

相關推薦

資料結構基礎 排序 演算法複雜淺析

/* 使用 Sedgewick增量 的 Shell Sort 程式 */ #include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX 1000000 //這裡設定要對多少個元素排序 void

資料結構排序(ShellSort)

  概念: 希爾排序法,又稱縮小增量法。希爾排序法的基本思想是:先選定一個整數, 把待排序檔案中所有資料分成幾個組,所有距離為gap的資料分在同一組內,並對每一組內的資料進行排序。 然後,去重複上述分組和排序的工作。當到達gap=1時,所有資料在一組內

資料結構】---排序

1、希爾排序是在直接插入排序的基礎上改良而來的,直接插入排序需要記錄基本有序的情況下才能變得很高效,希爾排序便是採取跳躍分割的策略,將相距“增量”的元素組成一個子序列,這樣才能保證最後進行直接插入排序時的序列是基本有序的。      希爾排序的時間複雜度是

排序實現與複雜、穩定性分析

import java.util.*; public class ShellSort { public int[] shellSort(int[] a, int n) { //先判斷條件

關於排序的時間複雜分析

     希爾排序又叫做“縮小增量排序”,它也是一種屬於插入排序類的方法,但是在時間複雜度上又有了改進。它的基本思想是,先將整個待排序記錄分割為若干個子序列分別插入排序,待整個序列中的記錄基本有序是,,再對全體記錄進行一次插入排序。 如下是一組增量序列分別為 3 2 1 的

資料結構基礎------1.線性表單鏈表的建立與輸出方法(Java版)

基礎知識: 線性表(linear list),是其組成元素間具有線性關係的一種線性結構。 線性表有 ①順序儲存結構(sequential storage structure) 順序儲存結構可以簡單的理解利用為 陣列 的形式來進行儲存資料。 ②鏈式儲存結構(ch

資料結構演算法隨筆------演算法複雜分析

一.演算法 1.演算法定義 2.什麼是好的演算法        常見的演算法時間複雜度由小到大依次為:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!) 此外,當你遇到一個Ο(n2)的演算法

排序Java實現

希爾排序思想: 希爾排序其實就是將一個數組分段進行插入排序,最後再將分段序列組合在一起進行大的插入排序。 也即:希爾排序是首先將陣列分成若干子陣列(一般子陣列的個數是n/2或者n/m,n是陣列長度,m是分隔間距),然後每個子陣列進行插入排序;再縮減增量(一般縮減增量表達式是

資料結構~~演算法複雜的介紹

在複習基本的資料結構之前,大致看了一下演算法。其實就是看了一下演算法的時間複雜度與空間複雜度的一些基本計算方式。雖然可能對初學者起的作用比較小,但是瞭解一下還是好的。可以為後面自己在做專案時候一些演算法優化的話很有幫助。 首先是**時間複雜度**: 在進行演算法分析時 語旬總的執行次撞 (

資料結構例程——選擇排序直接選擇排序

#include <stdio.h> #define MaxSize 20 typedef int KeyType; //定義關鍵字型別 typedef char InfoTy

資料結構)十分鐘搞定時間複雜演算法的時間複雜)【轉】

我們假設計算機執行一行基礎程式碼需要執行一次運算。 int aFunc(void) { printf("Hello, World!\n"); // 需要執行 1 次 return 0; // 需要執行 1 次 } 那麼上面這個

排序時間複雜和空間複雜總結

排序方法 平均時間複雜度 最好 最差 空間複雜度 穩定度 氣泡排序 o(n^2) o(n) o(n^2) o(1) 穩定 選擇排序 o(n^2)

資料結構與算法系列二(複雜分析)

1.引子 1.1.為什麼要學習資料結構與演算法? 有人說,資料結構與演算法,計算機網路,與作業系統都一樣,脫離日常開發,除了面試這輩子可能都用不到呀! 有人說,我是做業務開發的,只要熟練API,熟練框架,熟練各種中介軟體,寫的程式碼不也能“飛”起來嗎? 於是問題來了:為什麼還要學習資料結構與演算法呢?

資料結構演算法排序演算法(插入排序排序

3、插入排序 插入排序的基本操作就是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為O(n^2),是穩定的排序方法。插入演算法把要排序的陣列分成兩部分:第一部分包含了這個陣列的所有元素,但將最後一個元素除外(讓陣列多一個空間才

資料結構排序演算法(五)-直接插入排序排序,直接選擇排序

直接插入排序:時間複雜度:O(n^2) 基本演算法思路是:把後面待排序的記錄按其關鍵字的大小逐個插入到一個已經排好序的有序序列中,直到所有記錄插完為止,得到一個新的有序序列。(無序插入前面有序) 演算

資料結構直接插入排序、折半插入排序排序演算法

哪個成功的人不是一路坎坷過來的,只有這樣你才知道珍惜,知道成功的不易。有時候太容易得到的東西反而不知道珍惜。 直接插入排序: 我們的記錄本身就是基本有序的,我們只需要少量的插入操作,就可以完成整個記錄集的排序工作,此時直接插入很高效。還有就是記錄數比較少時,直接插入的優勢

JavaScript 資料結構演算法美 - 歸併排序、快速排序排序、堆排序

1. 前言 演算法為王。 想學好前端,先練好內功,只有內功深厚者,前端之路才會走得更遠。 筆者寫的 JavaScript 資料結構與演算法之美 系列用的語言是 JavaScript ,旨在入門資料結構與演算法和方便以後複習。 之所以把歸併排序、快速排序、希爾排序、堆排序放在一起比較,是因為它們的平均時

SWUST資料結構--排序演算法實現

#include<iostream> using namespace std; int main(){ int i,n; int a[50]; cin>>n; for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<

資料結構內部排序--排序

概要 -IDE:Pycharm -Python版本:python3.x -演算法分類:內部排序->插入類排序->希爾排序 演算法思想 希爾排序又稱縮小增量排序法,是一種基於插入思想的排序方法。它利用了直接插入排序的最佳性質,首先,將待排序的關鍵字序列分成若干個較小的序列,對子序列進行直接的插

基礎算法系列排序演算法-7.排序 並解決hdu 1425問題(java實現)

       我們從最初的氣泡排序演算法,到上篇文章的折半插入排序演算法,我們一共學習了5種排序演算法,相信以大家的聰明才智肯定都消化了^_^。在本篇文章中,我們又將學習第6種排序演算法——希爾排序演算法。那就讓我們直奔主題吧。 希爾排序  讓我們回想一下直接插入排序演算