1.冒泡排序
思想:從第一個元素開始,兩兩比較相鄰元素a1,a2,當a1>a2時,交換順序,比較下一組元素,循環操作,直到整個數組有序。
優點:穩定
缺點:效率低
代碼實現:
void bubble_sort(int* arr,int len)
{
if(arr == NULL || len < 0)
return ;
bool flag = true;
for(int i=0;i<len-1 && flag;i++)
{
flag = false;
for(int j=0;j<len-i-1;j++)
{
if(arr[j] > arr[j+1])
{
flag = true;
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
2.快速排序
思想:首先確定基準點的值,目地是將基準點防止到指定位置,使得左邊數據小於基準點,右邊數據大於基準點,隨後進行左右子串的遞歸排序,直到整個數組有序。
算法解讀:選取中間變量暫存基準點的值,指定i,j兩個指針,i指針從後向前遍歷,直到找到比基準點小的數據後停下,用該數據的值覆蓋基準點位置上的值,隨後j指針從前向後遍歷,直到找到比基準點大的數據後停下,用該數據的值覆蓋i指針位置上的值,重複i,j指針的遍歷,直到i=j,用基準點上的值覆蓋該位置上的值,完成一次基準點位置的確認,然後進行左右子串的遞歸遍歷,直到整個數組有序。
ps:動圖所展示的在找到基準點後子串的排序算法與常見快排略有不同,代碼實現以上述提到的思想爲主,動圖僅供參考。
優點:數據移動少
缺點:不穩定
代碼實現:
#include <stdio.h>
void sort(int a[], int left, int right) {
if(left >= right)//如果left大於或者等於right就代表已經整理完成一個部分了
{ return;}
int i = left;
int j = right;
int key = a[left];//選取基準點
while(i < j)//當i和j"相遇"的時候,說明所有元素都被比較了一遍,這時候就不用再循環
{
while(i < j && key <= a[j]) {
j--;//向前尋找 }
a[i] = a[j];//數值覆蓋
while(i < j && key >= a[i]) {
i++;//向後尋找}
a[j] = a[i];//數值覆蓋
}
a[i] = key;//確定基準點位置
sort(a, left, i - 1);//對左子串進行遞歸排序
sort(a, i + 1, right);//對右子串進行遞歸排序
}
void main() {
int a[]={5,6,1,4,9,2,9};
int i;
int length=sizeof(a)/sizeof(int);
sort(a,0,length-1);
for(i=0;i<length;i++){
printf("%d\t",a[i]);}
printf("\n");
}
3.二者複雜度比較