簡單排序 C 資料結構與演算法的遊戲開始

2021-10-03 20:56:10 字數 2668 閱讀 9392

簡單排序是排序演算法中基礎的部分,這部分演算法都是屬於o(n2)的演算法,雖然從數量級上看時間消耗要比後續的o(nlog(n))級別的演算法要慢,但實際表現卻不見得;特別是優化過後的插入排序,在對基本有序序列的排序的時耗很低,甚至可以超越onlog(n)級別的演算法;怎麼實現呢,我們逐個來看看(各排序耗時pk在最後)~~

選擇排序的主體實現思路:從陣列的第乙個成員開始逐個遍歷,找到最小那個放到第乙個位置,以此類推;

// 選擇排序

// 這裡設定了泛型(如對泛型不了解,可以簡單理解為int)

templatevoid selectsort(dt arr, int n)

// 一次遍歷獲取當前最大或最小值,當前左右邊界為未排序區間,

for(int i=left+1;iarr[maxindex])

}swap(arr[minindex],arr[left]);

swap(arr[maxindex],arr[right]);

left++;

right--;

}}

氣泡排序的主體實現思路:從第乙個陣列成員開始,從左到右兩兩比較,如果出現前面的成員資料比後面的小則交換資料,遍歷一次就能在右邊界處放置最大值,然後右邊界減1,繼續遍歷直到陣列有序;這裡有乙個小技巧,就是設定乙個標記,如果在一次遍歷中沒有進行一次資料交換,說明序列已有序,那麼就可以通過這個標記判斷是否在一次遍歷中有出現資料交換了,具體實現滑鼠滾起來;

//氣泡排序法

template void bubblesort(t arr, int n)

}// 標記是否改為true,判斷是否需要繼續迴圈排序

}

//氣泡排序法

template void bubblesort(t arr, int n)

}// 更新右邊界,有邊界往後序列已有序

}

插入排序的主體實現思路:來來來,打牌!這就是乙個打牌排序法,打牌的時候,一般習慣就是把同花色的牌放一起,而且會從左到右按序拿著,回想一下這個過程,會發現是摸一張就將這張插入到該在的位置;插入排序也就是從左到右遍歷,一邊遍歷,一邊將右邊遍歷到序列成員插入到左邊已經排好序的序列中

//插入排序法

template void insertsort(t arr, int n) else }}

}

插入排序的優化實現:基礎版的插入排序實現起來很簡單,但是有乙個弊端,試想一下打牌的時候,為了把新摸的牌放到這牌該在的位置,會不會在手中的牌從右到左乙個個位置插過來,直到這個牌到位了呢?那是乙個連想想都覺得尷尬的舉動,所以實際實現時大可減少這些不必要的資料交換,這就使得插入排序的效率得到了質的飛躍,在面對基本有序的序列時,插入排序甚至乾掉了複雜的o(nlog(n))級別的演算法;

//插入排序法

template void insertsort(t arr, int n) else

}// 將資料插入

arr[j] = candidate;

}}

希爾排序的主體實現思路:插入演算法的**馬甲,以低耗時的遍歷查詢次數換取更為耗時的資料賦值次數的減少;前面的三種排序,序列中乙個成員要到有序的位置必須進行逐個比較,比較後,如果發現位置要變,則必定會出現資料的交換或至少是賦值(挪位);然而如果知道最後乙個(或靠後)資料是最小的(或幾乎最小的),那麼最好的做法肯定就是直接跳過和中間序列成員的比較,將後面這個成員跳到前面去比較,這樣就減少了很多不必要的挪位;希爾演算法就是通過先以大間隔進行比較,讓遠離有序位置的成員跳躍性地進行比較到所需位置的附近,從大間隔的比較然後逐漸到間隔為1的比較,從而達到序列有序;這個過程雖然增加了查詢次數,但是因為查詢比賦值耗時要低很多,所以實際意義很大;但需要注意的時候在面對基本有序序列時,插入排序仍然最優,因為面對基本有序序列,插入排序的機制讓插入排序只需比較,很少賦值,而希爾排序增加的查詢時間在這個時候就不夠給力了,那基本有序到什麼程度呢,我肯定不會告訴你大概時100000個資料中只有200個資料未排好序時,超過了時還是希爾牛;

// 希爾排序法

templatevoid shellsort(t arr, int n)

while(d >= 1) ;

int index = 16;

//while(d >= 1) {

while(index >= 0) {

int d = sedgewickseq[index];

// 開始插入排序,對每個資料逐個按d個間隔進行排序,對於0到d的資料,在下面的for迴圈中考慮進去了

for(int i=1;i=d && candidate比賽規則:

對10萬個資料進行排序;

分隨機數序列和基本有序序列兩場比賽;

基本有序序列的未有序資料數量是200個;

所有排序法均已優化;

從上到下是選擇排序、氣泡排序、插入排序、希爾排序;

隨機數序列:

selectsort:5.686

bubblesort:34.211

insertsort:5.556

shellsort:0.019

基本有序序列:

selectsort:5.711

bubblesort:0.975

insertsort:0.005

shellsort:0.006

比賽結果:

資料結構與演算法(1) 簡單排序

資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題 資料結構分為 邏輯結構 和 物理結構 兩類 邏輯結構分類 物理結構分類 邏輯結構在計算機中真正的表示方式 又稱為映像 稱為物理結構,也可以叫做儲存結構。常見的物理結構有順序儲存結構 鏈式儲存結構 時間複雜度 ...

資料結構與演算法 3 簡單排序

氣泡排序的api設計 class bubble 兩個數之間換位置 private static void exch comparable a,int i,int j 適用於輸入規模比較少的時候 選擇排序的api設計 public class testselection selection.sort ...

資料結構 簡單排序

1 氣泡排序 package chap02 public class bubblesort 測試類 package chap02 public class testsort system.out.println 排序前 system.out.print for int i 0 i arr.lengt...