冒泡排序:
思路:將相鄰的兩個數比較,將較小的數調到前頭;有n個數就要進行n-1趟比較,第一次比較中要進行n-1次兩兩比較,在第j趟比較中,要進行n-j次兩兩比較。
依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複以上過程,直至最終完成排序。
兩種方式寫:
第一種就是每次遍歷從前往後,第二種是每次從後往前
從前往後的話就是,每次確定的是最後一個最大的數
從後往前的話就是,每次確定的是最前邊的最小的數
void bubble_sort(int a[], int n)
{
int i, j, temp;
for (j = 0; j < n - 1; j++)
for (i = 0; i < n - 1 - j; i++)
{
if(a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
void BubbleSort(int[] array)
{
int length = array.Length;
for (int i = 0; i <= length - 1; i++)
{
for (int j = length - 1; j > i; j--)
{
if (array[j] < array[j - 1] )
{
int temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
}
}
選擇排序:選擇一個值array[0]作爲標杆,然後循環找到除這個值外最小的值(查找小於標杆的最小值),交換這兩個值,這時最小值就被放到了array[0]上,然後再將array[1]作爲標杆,從剩下未排序的值中找到最小值,並交換這兩個值。
如圖:(數據結構與算法中的圖)
2、時間複雜度:O(N^2),不穩定算法,與冒泡排序相比減少了數組交換的次數
void choicesort(int * a,int n){
for(int i=0;i<n-1;i++){
int min=a[i];
int key=0;
for(int j=i+1;j<n;j++){
if(min>a[j]){
min=a[j];
key=j;
}
}
//交換
a[key]=a[i];
a[i]=min;
}
}
直接插入排序
插入排序就是每一步都將一個待排數據按其大小插入到已經排序的數據中的適當位置,直到全部插入完畢。
插入排序的工作方式像玩撲克牌時順序放牌一樣。開始時,左手爲空並且桌子上的牌面向下。然後,每次從桌上拿一張牌並將它插入左手中正確的位置。爲了找到正確的位置,我們從右到左將它與已在手中的每張牌比較,原來的牌是排好序的,如果比剛拿出的牌大,則將其再向右移一個位置,直到找到一個比剛拿出來的牌更小的,此時將這張牌放到該位置。
算法適用於少量數據的排序,時間複雜度爲O(n^2)。是穩定的排序方法,即兩個相等的元素在排序後能保持原來的順序。
void insertsort(int *a,int n ){
for(int j=1;j<n;j++){
int key=a[j];
int i=j-1;
while(i>0&&a[i]>key){
a[i+1]=a[i];
i--;
}
a[i+1]=key;
}
}