十種常見排序演算法一般分為以下幾種:
(1)非線性時間比較類排序:交換類排序(快速排序和氣泡排序)、插入類排序(簡單插入排序和希爾排序)、選擇類排序(簡單選擇排序和堆排序)、歸併排序(二路歸併排序和多路歸併排序);
(2)線性時間非比較類排序:計數排序、基數排序和桶排序。
總結:
(1)在比較類排序中,歸併排序號稱最快,其次是快速排序和堆排序,兩者不相伯仲,但是有一點需要注意,資料初始排序狀態對堆排序不會產生太大的影響,而快速排序卻恰恰相反。
(2)線性時間非比較類排序一般要優於非線性時間比較類排序,但前者對待排序元素的要求較為嚴格,比如計數排序要求待排序數的最大值不能太大,桶排序要求元素按照hash分桶後桶內元素的數量要均勻。線性時間非比較類排序的典型特點是以空間換時間。
注:本博文的示例**均已遞增排序為目的。
#include #include #include //動態演示排序
//交換函式 方便下面排序函式的使用
void swap(int *a,int *b)
/* ******氣泡排序******
1,比較兩個數的大小
2,交換兩個數的位置
最好情況:順序o(n)
最壞情況:逆序o(n*n)
****************
*/void bubble_sort(int *a , int n)
} //相鄰的元素如果都有順序 不用進行迴圈了
if(flag == false)
}}/*
******選擇排序******
每次找到最大的下標 然後放在最後面
****************
*/void select_sort(int arr,int n)
} //將找到的最大元素交換到本趟排序數的最後面
if(maxindex != n-i)
}}/*
******插入排序******
迴圈移動 直到 arr[j] >= num
放到 j+1
如果沒有移動 不需要改變
最好情況:順序o(n)
最壞情況:逆序o(n*n)
****************
*/void insert_sort(int arr, int n)
// arr[j] = num;
for(j = i-1; j >= 0; j--)
else//如果 arr[j] >= num 插入到 j+1
}//如果不相等證明 移動了 否則 沒有移動(證明不需要移動)也就不需要改變
if(j != i-1)
}}void binaryinsert_sort(int arr, int len)
else
}for(int j = i -1; j >= left; j--)
arr[left] = num; }}
/* ******雞尾酒排序******
相當於選擇排序
同時找到最小與最大的元素
節省時間
*****************
*/void cocktailsort(int arr,int n )
if(arr[j] < arr[min])
}if(max != n-i)
//如果要交換位置是最後位置 然而最後位置的值剛才已經改變
if(min == n -i) //本來儲存的值已經到了 arr[max]的位置
else if(min != i -1 )
}}/*
******歸併排序******
歸併排序(merge-sort)是利用歸併的思想實現的排序方法,
該演算法採用經典的分治(divide-and-conquer) 策略
(分治法將問題分(divide)成一些小的問題然後遞迴求解,
而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,
即分而治之)。
****************
*/int* merge(int arr,int len1,int brr,int len2)
else
}while(ikey;j--);
if(j > i)
for(; i i)
}arr[i] = key;
if(i -1> left)
if(i+1 < right) }
//快速排序是不穩定的
void quick_sort(int arr,int len)
/* ***********桶排序***********
按照大小把這些資料分到不同的桶裡
再對這些桶進行分別排序
考慮他的疏密情況
*/void show(int *a,int n)
printf("\n");
}int main()
; int a[5] = ;
int b[6] = ;
int *p;
p = merge(a,5,b,6);
show(p,11);
printf("\n");
//cocktailsort(arr,10);
//maopaosort(arr,10);
quick_sort(arr,10);
//insertsort(arr,10);
show(arr,10);
int x =1,y=2;
swap(&x,&y);
printf("%d %d\n",x,y);
printf("\n");
return 0;
}
總結 經典排序演算法 C )
最近在學習演算法,趁這個機會總結一些演算法。慢慢更新,歡迎交流 排序 輸入 n個數 輸出 有序 從大到小 從小到大 序列 一 插入排序 做排序的都需要做遍歷,而插入排序,顧名思義,就是插隊。不必多說,給個案例體會一下 輸入 5 4 3 2 1 處理 輸出 1 2 3 4 5 輸入 6 8 2 4 5...
經典排序演算法總結
排序演算法是離散數學和資料結構學科最基本的演算法,雖然知道這些排序演算法的名字,但是一直沒有研究過它們的實現原理。現在把它們收集起來,並一一親自實現,來加深對排序演算法的理解。1,氣泡排序 最簡單的排序演算法,從第乙個元素開始比較相鄰元素大小,如果前邊元素大於後邊元素則交換位置,否則將下標移到下乙個...
經典排序演算法總結
插入排序 選擇排序 歸併排序 排序方法 平均情況 最好最差 空間複雜度 穩定性氣泡排序o n2 o n 2 o n o n o n2 o n 2 o 1 o 1 穩定快速排序o nlogn o nlog n o nlogn o nlog n o n2 o n 2 o nlogn o nlog n 不...