排序,應該可以說在資料結構中佔很重要的位置,我們常用的排序演算法,可以分為兩組:
一種是比較排序,主要有:氣泡排序,選擇排序,直接插入排序,歸併排序,堆排序,快速排序,希爾排序。
另一種是非比較排序,主要有:計數排序,基數排序,桶排序等。
今天我寫的是自己對於氣泡排序,選擇排序,直接插入排序,希爾排序四個排序演算法的淺見。
排序演算法,因為是演算法,很多同學會覺得很繞,理不清思路,其實沒有很難理解,畫圖就是乙個很容易幫我們理解的方法。
注:今天我舉的所有例子都是從小到大排序噠、、、
一.氣泡排序(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.快速排序 第一步,...