[C/C++ 演算法]-資料結構與演算法(文魁):快速排序
[C/C++ 演算法]-資料結構與演算法(文魁):快速排序
線上執行結果:http://www.tutorialspoint.com/compile_c_online.php
code2html:http://tohtml.com/
/* =============== Program Description =============== */
/* 程式名稱 : 6_8.cpp */
/* 程式目的 : 快速排序 */
/* 輸 入 : 排序前的整數陣列資料 */
/* 輸 出 : 排序後的整數陣列資料 */
/* =================================================== */
#define n 20
// 宣告標頭檔
#include "stdio.h"
// 宣告函式原型
// 利用傳址的方式把Array A傳進quick_sort函式中
void quick_sort(int *A,int left,int right);
// 利用傳參考的方式把Value1,Value2兩個變數,傳入swap函式中
void swap(int *Value1, int *Value2);
void main(void)
{
int i;
int A[n]={1,21,0,47,60,
15,84,65,77,88,
100,93,8,17,36,
5,24,63,72,20};
// 排序前的資料
printf(" Data before sorting \n");
for(i=0;i<n;i++)
printf("%d",A[i]);
printf("\n");
quick_sort(A,0,n-1);
// 排序後的資料
printf(" Data after sorting \n");
for(i=0;i<n;i++)
printf("%d",A[i]);
printf("\n");
getchar();
}
void quick_sort(int *A,int left,int right)
{
int low,upper, point;
if(left < right) {
point = A[left];
low = left;
upper = right + 1;
while(1) {
while(A[++low] < point) ; // 向右找
while(A[--upper] > point) ; // 向左找
if(low >= upper)
break;
swap(&A[low], &A[upper]);
}
A[left] = A[upper];
A[upper] = point;
quick_sort(A, left, upper-1); // 對左邊進行遞迴
quick_sort(A, upper+1, right); // 對右邊進行遞迴
}
}
void swap(int *Value1, int *Value2)
{
int temp;
temp = *Value2;
*Value2 = *Value1;
*Value1 = temp;
}
One thought on “[C/C++ 演算法]-資料結構與演算法(文魁):快速排序”
排序法的性能評估指標:
穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面。
不穩定:如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面。
時間複雜度:對排序數據的總的操作次數。反映當n變化時,操作次數呈現什麼規律。
空間複雜度:是指算法在計算機內執行時所需存儲空間的度量,它也是數據規模n的函數。
PS. 個人認為目前最為推薦 [ 效率(速度)&額外記憶體使用量&穩定度 ] 的排序法 – 归并排序/歸併排序/合併排序 (Merge Sort)