排序演算法有氣泡排序、選擇排序、插入排序、歸併排序和快速排序。最近寫了一下,在這裡做一下總結。
氣泡排序是最簡單的排序演算法之一,重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從a到z)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。
void bubblesort(int a,int l)//a為陣列頭指標,l為陣列長度
} }}
選擇排序是指,對乙個序列a中的元素a[0]~a[l-1],令i 從0到l-1列舉,進行l趟操作,每趟從待排序部分[i,l-1]中選擇最小的元素,令其與待排序部分的第乙個元素a[i]進行交換,這樣元素元素a[i]就會與當前有序區間[0,i-1]形成新的有序區間[0,i],於是在l趟操作後,所有元素都會是有序的。演算法的複雜度為o(n
2)
o(n^2)
o(n2)。
void selectsort(int a,int l)
} int tmp = a[i];
a[i] = a[k];
a[k] = tmp;
}}
插入排序中最簡單的一類是是直接插入排序,直接插入排序是指,對序列a的l個元素a[0]至a[l-1],令i從1到l-1列舉,進行l-1趟操作。假設某一趟時,序列a的前i個元素a[0]至a[i-1]已經有序,而範圍[i,l-1]還未有序,那麼該趟從範圍[0,i-1]中尋找某個位置j,是的將a[i]插入位置j後(此時a[j]到a[i-1]會後移一位至a[j+1]~a[i]),範圍[0,i]有序。
void insertsort(int a,int l)
a[j] = tmp;
}}
歸併排序是一種基於「歸併」思想的排序方法,其中,2-路歸併排序是一種比較有代表性的歸併排序演算法。其原理是,將序列兩兩分組,將序列歸併為n/2個組,組內單獨排序;然後將這些組再兩兩歸併,生成n/4個組,組內再單獨排序;以此類推,知道剩下乙個組為止。歸併排序的時間複雜度為o(nlogn)。
void merge(int a,int l1,int r1,int l2,int r2)
else
k++;
} while(i<=r1)tmp[k++] = a[i++];
while(j<=r2)tmp[k++] = a[j++];
for(int ii = l1;ii < l1 + k;ii++) }
void mergesort(int a,int l,int r)
}
快速排序是排序演算法中時間複雜度為o(nlogn)的一種演算法,其實現需要先解決這樣乙個問題,對乙個序列a[0]、a[1]、… 、a[l-1],調整序列中元素的位置,使得a[0](原序列的a[0])的左側所以元素都不超過a[0]、右側所有元素都大於a[0]。例如對序列來說,可以調整序列中元素的位置,形成序列,這樣就讓a[0]=5左側的所有元素都不超過它、右側所有元素都大於它。
int partition(int a,int left,int right)
a[left] = tmp;
return left;
}void quicksort(int a,int left,int right)
}
排序演算法總結
1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...
排序演算法總結
1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...
排序演算法總結
學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...