算法- C语言实现侏儒(地精)排序(Gnome_sort)
目錄
引言
什么是侏儒排序(Gnome_sort)?
侏儒排序的排序原理:
演示侏儒排序的過程:
序列最開始的樣子:
第一趟排序:
第二趟排序:
第三趟排序:?
第四趟排序:?
第五趟排序:
第六趟排序:
第七趟排序:
第八趟排序:?
第九趟排序:
代碼實現:
引言
侏儒排序也叫地精排序,是我在一個算法可視化的視頻里非常巧合的遇到的一個有趣的算法,我感覺非常有意思,今天在地鐵上聽著歌沒事干,在手機備忘錄上對這個算法進行了試數:???????
排序原理已經基本清楚,這個算法個人認為是一個介于冒泡排序和插入排序之間的一個算法,因為這個算法的最初版本就是冒泡排序再冒回去,結果比較像插入排序,但是過程卻和冒泡排序十分的相似。當我們對這個算法進行優化,最后卻和插入排序幾乎一模一樣。廢話不多說,下面我們對這個算法進行詳細的介紹并用代碼實現。
什么是侏儒排序(Gnome_sort)?
Gnome_sort,是一個和插入排序算法類似,但是過程又和冒泡排序十分相像的算法,這個算法和插入排序相似在兩者都是將元素移動到合適的位置,并通過一系列交換完成。我覺得這個算法厲害在整個算法結構只有一層循環,在大部分數據都是有序的情況下,是可以在最大限度減少交換的回合數的。
侏儒排序的排序原理:
我們定義一個數組的指針?i?(i的默認值為1)和序列的長度len,通過 i 對整個序列進行遍歷。i的位置和大小在排序過程中是一直變化的,如果序列中相鄰的元素的大小關系不符合前小后大的關系,我們就要對元素的位置進行調換,并且如果發生元素的調換,i就要向后挪一位,也就是(i--)反之如果元素之間沒有發生調換,i就要一直往前走,也就是(i++)直到i下標不滿足i < len的條件時,排序已經完成,跳出循環并打印數組。
演示侏儒排序的過程:
我在這里給一個隨機數組:
int arr[] = {9,7,6,8,5,3,4,1,2,10};為了更直觀的體現排序過程,我們在畫板上進行演示:
序列最開始的樣子:
第一趟排序:
?
i 的默認值為1,我們對9和7進行比較,我們發現9 > 7不滿足升序序列的條件,所以我們將9和7的位置進行調換,i--此時i的值為0
第二趟排序:
此時再次對比,指針i向后遷移一位到達7的位置,我們比較指針i所指的元素和它的后一位元素,7 < 9,所以i++,指針此時指向元素9,我們比較9和6,9 > 6,所以我們調換元素9和元素6的位置,i--,現在i指向元素7,但是調換了元素9和元素6之后,6是小于7的,于是我們進行第二次調換,調換元素6和元素7,i--,再次向后移一位,序列中發生了兩次調換,現在i的值為0:
第三趟排序:?
此時i++,我們發現i = 1,i = 2,都是滿足條件的,直到i = 3時我們對9和8進行對比,已不滿足條件,此時我們對元素9和元素8進行位置調換,同時i的值減1,此時i指向元素7:
第四趟排序:?
同理,當我們的指針i指向元素9時不滿足條件,我們對元素9和它后面的元素5進行位置調換,同時我們發現5是小于前面每一個數的,所以我們將元素5挪到最前面并將所有的值向后遷移一位,那么每發生一次調換i的值就減一,所以i的值此時也變成0:
第五趟排序:
指針i繼續向后遷移,直到i= 5時,9和3不滿足規律,同樣元素3小于前面的每一個元素,于是我們再次一步一步地進行調換,i的值也隨著調換次數的增長而減小,將元素3換到最前面的時候,i的值也就變為了0:
第六趟排序:
?同理,當i = 6時,9和4不再滿足規律,同時我們發現4小于前面除了元素3以外的任何元素,于是我們一步一步地將元素4調換至元素3的后面,此時i指向元素3:
第七趟排序:
同上,i = 7時,9 > 1,我們發現1小于前面的任何一個元素,于是我們一步一步的進行調換,直到將元素1放在序列的最前面:此時i = 0:
第八趟排序:?
同上,i = 8時,9和2不滿足條件,于是我們將9和2進行調換,2小于前面除了元素1的任何一個數,于是我們將2放到1元素的后面,3元素的前面,此時i指向元素1:
第九趟排序:
我們此時比較i指向的元素1和它后面的元素2,滿足規律,i++,比較2和它后面的元素3,滿足規律,i++,比較3和它后面的元素,滿足規律,直到i = 9依然滿足規律,i++,i的值為10,此時已經不滿足i < len的限定條件,說明此時已經序列已經排好序,我們此時跳出循環,并打印數據。
排序過程演示完成,我們下面嘗試用代碼實現侏儒排序:
代碼實現:
#define MAXSIZE 11 #include<stdio.h> #include<iostream> #include<stdlib.h> #include<assert.h> #include<time.h> void initar(int *ar,int len) {assert(ar != nullptr);for(int i = 0;i < len;i++){ar[i] = rand() % 30;} } void showar(int *ar,int len) {assert(ar != nullptr);for(int i = 0;i < len;i++){printf("%d ",ar[i]);}printf("\n--------------------------\n"); } void swap(int *ar,int index1,int index2) {int temp = ar[index1];ar[index1] = ar[index2];ar[index2] = temp; } void Gnome_sort(int *ar,int len)//侏儒排序算法 {assert(ar != nullptr && len >= 0);int i = 0;while(i < len){if(i == 0 || ar[i - 1] <= ar[i])i++;else{swap(ar,i,i - 1);i--;}} } int main() {srand((unsigned int)time(NULL));int ar[MAXSIZE];initar(ar,MAXSIZE);printf("原始數據為:\n");showar(ar,MAXSIZE);printf("\n經過侏儒排序后的數據為:\n");Gnome_sort(ar,MAXSIZE);showar(ar,MAXSIZE); }運行結果:
如圖,成功的對系統隨機生成的11個數進行了排序。?
后續我還會對侏儒排序算法的優化進行補充。
總結
以上是生活随笔為你收集整理的算法- C语言实现侏儒(地精)排序(Gnome_sort)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地图API公交线路查询
- 下一篇: OSW工具-Oracle的OS watc