資料結構之排序1(直接插入,冒泡,希爾,選擇)

2021-08-14 22:39:25 字數 3934 閱讀 8835

排序,應該可以說在資料結構中佔很重要的位置,我們常用的排序演算法,可以分為兩組:

一種是比較排序,主要有:氣泡排序,選擇排序,直接插入排序,歸併排序,堆排序,快速排序,希爾排序。

另一種是非比較排序,主要有:計數排序,基數排序,桶排序等。

今天我寫的是自己對於氣泡排序,選擇排序,直接插入排序,希爾排序四個排序演算法的淺見。

排序演算法,因為是演算法,很多同學會覺得很繞,理不清思路,其實沒有很難理解,畫圖就是乙個很容易幫我們理解的方法。

注:今天我舉的所有例子都是從小到大排序噠、、、

一.氣泡排序(bubblesort)

氣泡排序通俗的理解它的基本思想就是兩個數比較,較大的往下沉,較小的往上冒。

也就是說比較相鄰的兩個資料,如果第二個數小,就交換位置。就這樣兩兩比較,一直到比較最前兩個資料。最終最小數被交換到起始的位置,這樣第乙個最小數的位置就排好了。繼續重複上述過程,依次將第2.3…n-1個最小數排好位置。

平均時間複雜度是:o(n2)

這是外層一次for迴圈,內層迴圈一遍的結果,找到的是最小的乙個元素,像這樣重複外層for迴圈就能找到第二小,第三小,直到得到最後的結果!

接下來**實現一下氣泡排序演算法的函式;

void bubble_sort(int *arr,int

len)//氣泡排序}}

}

接下來我們來優化一下氣泡排序:

void bubble_sort(int *arr,int

len)//氣泡排序

}if(!swap)}}

大家可以看到,**中我定義了乙個布林型別的swap變數,外層迴圈一進去將swap置為false,進入內層迴圈進行交換,在交換的最後將swap置為true,這裡就是每次進入外層迴圈會判斷一下swap的值,如果它為false,說明並沒有進入內層交換,說明已經有序,直接退出,交換的少了,是冒泡的一種優化演算法。

二. 選擇排序(selctionsort)

選擇排序的基本思想:

在長度為n的無序陣列中,第一次遍歷n-1個數,找到最小的數值與第乙個元素交換;

第二次遍歷n-2個數,找到最小的數值與第二個元素交換;

。。。

第n-1次遍歷,找到最小的數值與第n-1個元素交換,排序完成。

這裡我畫圖模擬了外層一二次迴圈,你可以自己下去把圖畫完,我們來分析一下,i控制的是外層迴圈,這裡定義乙個index_min,我用m代替的,一開始把i賦值給index_min,之後用index_min和j進行比較,j的初始值是i+1,每次用index_min和j進行比較,如果index_min比j大,就把j賦值給index_min,出來判斷一下,如果index_min不等於i,說明index_min和j交換律,就把index_min下標對應的值和j下標對應的值進行交換,j++,這樣走到最後得到的是第乙個數字最小的乙個序列,這是到第二次外層迴圈,i++,再重複上面步驟,直到最後得到的就是從小到大的有序序列。

c語言**實現如下:

void select_sort(int *arr,int

len)//選擇排序}}

}

三.直接插入排序(insertion sort)直接插入排序,通俗來說就是兩個比較,將第三個開始的值往前面的值裡按大小插入。

具體演算法描述如下:

1.從第乙個元素開始,該元素可以認為已經被排序

2.取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

3.如果該元素(已排序)大於新元素,將該元素移到下一位置

4.重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

5.將新元素插入到該位置後

重複步驟2~5

這個圖似乎畫的有點尷尬,大家凑活看,直接插入排序這裡依然是雙重for迴圈,i控制外層for迴圈,就是迴圈來比較,j控制裡層for迴圈,控制的是比較完要插入時比要插入數大的數向後移的迴圈,其實也就是比它本身大的數的個數。

我用c語言**實現一下:

void insert_sort2(int *arr,int len)//直接插入排序2

else

}arr[j+1] = tmp;}}

大家可以看到我上面標註的是插入排序2,插入排序方法很多,我實現了兩個,另外一種會貼在最後完整的原始碼中。

四.希爾排序(shell)

接下來我用c語言**實現:

void shell(int *arr,int len,int gap)//希爾排序

else

}arr[j+gap] = tmp;

}}void shell_sort(int *arr,int len)

;//定義乙個陣列存放增量

int lend = sizeof(drr)/sizeof(drr[0]);//陣列求長度

for(int i=1;i//呼叫shell()函式}}

那麼,接下來我貼出全部原始碼,供你們參考:

#include#include#includevoid insert_sort1(int *arr, int

len) //直接插入排序1

} void insert_sort2(int *arr,int

len)//直接插入排序2

else

}arr[j+1] = tmp;

}}void shell(int *arr,int

len,int gap)//希爾排序

else

}arr[j+gap] = tmp;

}}void shell_sort(int *arr,int

len)

; int lend = sizeof(drr)/sizeof(drr[0]);

for(int i=1;ilen,drr[i]);

}}void select_sort(int *arr,int

len)//選擇排序}}

}void bubble_sort(int *arr,int

len)//氣泡排序

}if(!swap)

}}void show(int *arr,int

len)

printf("\n");

}int main()

; int

len = sizeof(ar)/sizeof(ar[0]);

insert_sort1(ar,len);

show(ar,len);

insert_sort2(ar,len);

show(ar,len);

shell_sort(ar,len);

show(ar,len);

bubble_sort(ar,len);

show(ar,len);

select_sort(ar,len);

show(ar,len);

return

0;}

資料結構之氣泡排序,氣泡排序與直接插入排序比較

氣泡排序只會操作相鄰的兩個元素,每次對相鄰的兩個元素做大小比較,看是否滿足大小關係。一次冒泡至少會讓乙個元素移動到最終位置 冒泡 時間複雜度o n 2 空間複雜度o 1 穩定性排序 public static void bubblesort int array else if flag long e...

資料結構之 直接插入排序

直接插入排序即是在要排序的陣列中,假設前n 1 n 2 個數已經是排好序的,現在要把第n個數插入到前n個已經排好序的陣列中,使得這n個數也變成有序的,如此反覆迴圈,使得要排序的陣列中的最後乙個元素也排好序。我們可以先假設第乙個數是排好序的,然後第二個數和第乙個數進行比較,如果第二個數比第乙個數大,那...

資料結構排序,冒泡,快速,直接選擇,直接插入,希爾

交換排序 1.氣泡排序 public class sort 氣泡排序 public void bubble int a public static void main string args sort bs new sort bs.bubble a for int i 0 i 2.快速排序 第一步,...