直接插入排序的基本方法:每步將乙個待排序的元素,按其排序碼的大小,插入到前面已經排好序的一組元素的適當位置上去,直到元素全部插入為止。
插入排序(insert sorting)思想:當插入第i個元素時,前面的v[0],v[1],v[2]......v[i-1],已經排好序了.這時用v[i]的插入碼與v[i-1],v[i-2],......排序碼進行比較,找到插入的位置即插入v[i],原來位置上的元素從後向前依次後移。
時間複雜度: 平均比較次數o(n2),平均移動次數 o(n2).
直接插入排序是一種穩定的排序。元素大部分有序時效率會更高,這時比較次數和移動次數都會減少。
void sort::insertsort(datalist&datalist, int n)
return;
} elementtemp = datalist.m_pvector[n];
int j;
for ( j = n; j > 0; j--)
else
} datalist.m_pvector[j] = temp;
}
二分(折半)插入(binary insert sort)排序基本思想:設在資料表中有乙個元素序列v[0],v[1],v[2]......v[n].其中v[0],v[1],v[2]......v[i-1]是已經排好序的元素。在插入v[i]。利用折半搜尋尋找v[i]的插入位置。
二分插入排序是一種穩定的排序。當n較大時,總排序碼比較次數比直接插入排序的最差情況好得多,但比最好情況要差,所元素初始序列已經按排序碼接近有序時,直接插入排序比二分插入排序比較次數少。二分插入排序元素移動次數與直接插入排序相同,依賴於元素初始序列。
template void sort::binaryinsert(datalist&datalist, int n)
return;
} elementtemp = datalist.m_pvector[n];
int left = 0, right = n - 1;
while(left <= right)
else
} for (int j = n - 1; j >= left; j--)
datalist.m_pvector[left] = temp;
}
希爾排序(shell sort)基本思想: 改進的直接插入演算法。設待排序的元素序列有n個元素,首先取一整數gap(希爾排序是一種不穩定的排序。
void swap(int *a, int *b)
void insertion_sort(int data, int n, int increment)
}}void shellsort(int data, int n)
}}
template void sort::shellsort(datalist&datalist, int gap /* = -1 */)
return;
} for (int i = gap; i < datalist.m_ncurrentsize; i++) }
template void sort::insert(datalist&datalist, int n, int gap)
}}
總結:以上三種排序方法的核心都是直接插入排序,直接插入排序對於大部分有序的序列排序時速度快。二分插入排序在直接插入的基本上改變了查詢元素插入位置的方法,對於完全無序的序列來說,速度會變快,但是對開大部分有序的序列反而會更慢,希爾排序則利用直接插入排序對於大部分有序的序列速度快的特點,先讓大部分序列有序,以此來提高排序效率。 插入排序 簡單插入排序 二分插入排序
1 假設我們手裡的數字是一堆亂序撲克牌,我們想把它整理成從小到大的排序,會怎麼辦呢,我們會從左往右挨個將牌抽出來插到它合適的位置,這樣一輪之後,就變成從小到大的順序了。2 程式上怎麼實現,從第二位開始,逐個將後乙個數和它之前所有的資料進行比較,尋找這個數最合適的插入位置,將其插入空隙,後面的值依次會...
插入排序 直接插入排序 二分插入排序 希爾排序
選擇排序是一種較為簡單的排序演算法。它的實現原理是每一次從待排序的資料元素中挑出乙個最小 大 的元素,存放在資料的起始 末尾 位置,直到所有待排序的資料排完。直接插入排序 當插入第i個元素的時候,我們認為它前面的i個元素已序。這時候用array i 的排序嗎與前面的排序碼進行比較,找到適合的位置就進...
插入排序,二分插入排序,希爾排序思想與比較
直接插入排序的基本方法 每步將乙個待排序的元素,按其排序碼的大小,插入到前面已經排好序的一組元素的適當位置上去,直到元素全部插入為止。插入排序 insert sorting 思想 當插入第i個元素時,前面的v 0 v 1 v 2 v i 1 已經排好序了.這時用v i 的插入碼與v i 1 v i ...