選擇排序和插入排序

2022-03-18 05:02:17 字數 1442 閱讀 2792

選擇排序

選擇排序的思想非常簡單,很多書或技術blog都講的很好,這裡不贅述了,直接給出**

1

void selectionsort(int arr,intn)8

swap(arr[i],arr[minidx]);9}

10 }

如果考慮通用性,可以使用模板函式

1 template2

void selectionsort(t arr,int

n)10 }

插入排序

插入排序的思想非常簡單,無論是經典教材《演算法導論》還是不少技術文章都以撲克牌為例,手裡的牌是有序的,每拿到一張新牌會為它在排好序的牌中找出合適的位置插入。

**如下:

1

void insertion_sort(int arr,intn)9

}10return

;11 }

對比選擇排序,雖然都是o(n^2)級別的,但是,我們發現,插入排序可以提前結束退出,所以理論上講插入排序應該比選擇排序快,這裡,可以寫個測試測試一下。測試結果,發現,比選擇排序慢,仔細觀察,我們發現,在第二層迴圈中,每當出現逆序(比較操作)就swap(),swap()函式的實現,我們在大學剛學習高階語言程式設計時應該就學過,它需要乙個臨時變數,三句實現,需要花費三倍於比較時間。對於陣列來說,還有訪問操作,那能不能改進插入排序演算法,使之在第二層迴圈中只交換一次呢。當然,答案是可以的。

首先,我們把要考查的當前元素複製乙份,接著將該元素副本與已排好序的元素比較,只要比當前元素大,就後移,最終不再移動的位置就應該是當前要考察元素的位置,等有時間了,我會把這段思考過程用的形式演示出來,下面先放上**

1

void insertion_sort_opti(int arr,int

n)8 arr[j] =cur;9}

10return

;11 }

希爾排序

之所以把希爾排序列在這裡,是因為希爾排序也是一種插入排序,希爾排序整體的思路就是插入排序的延伸,在插入排序中,每一次都和之前的乙個元素進行比較,而希爾排序是每一次都和之前的第h個元素進行比較,h從乙個很大的值逐漸減小為1,一步步將乙個完全無序的陣列變成乙個近乎有序的陣列,變成有序性越來越強的陣列,直到最後變成乙個有序的陣列,不難理解,希爾排序會更高效,因為插入排序對於有序陣列的可以達到線性的時間複雜度,既然是插入排序的延伸,依然給出未優化的和優化的版本,實現如下:

v1

1

void shell_sort(int arr,int

n)13

}14 h/=3;15

}16 }

優化版本

1

void shell_sort_opti(int arr,int

n)13 h/=3;14

}15 }

選擇排序和插入排序

選擇排序 時間複雜度 o n 2 額外空間複雜度o 1 選擇排序是從陣列的第乙個值即arr 0 開始,先假定當前值為最小值,記下index值,向後遍歷陣列,當 arr i 小於arr index 時,令index i 一直到arr length 1 獲得最小值的index然後與arr 0 交換,此時...

插入排序和選擇排序

排序 將一組雜亂無章的資料按照一定的規則有組織地排列起來。排序的穩定性 如果在排序中,存在前後相同的兩個元素的話,排序前和排序後他們的相對位置不發生變化。今天,先來學習插入排序和選擇排序 插入排序 直接插入排序 1 思想 每一步將乙個待排序的元其排序碼的大小,插入到前面已將排好序的一組元素的合適位置...

插入排序和選擇排序

插入排序 插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料。從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 如果該元素 已排序 大於新元素,將該元素移到下一位置 重複步驟3,直到找到已排序的元素小於或者...