#include <stdio.h> #include <stdlib.h> #include <string.h> void SelSort(int A[], int n) //氣泡排序法之副程式 { int i, j, k, Temp; for(k=0; k<n; k++) { printf("%d ",A[k]); } printf("\n "); for (i = 0; i < n-1; i++) { for (j = 0; j < (n-1)-i; j++) { if (A[j] > A[j+1]) { //相鄰兩個的資料交換位置 Temp = A[j]; A[j] = A[j+1]; A[j+1] = Temp; } for(k=0; k<n; k++) { printf("%d ",A[k]); } printf("\n "); } } return; } int main() { int A[6]= {3,78,4,52,34,1}; int n = 6; SelSort( A, n); return 0; }
選擇排序(Selection sorting)
#include <stdio.h> #include <stdlib.h> #include <string.h> void SelSort(int A[], int n) //選擇排序法之副程式 { int i, j, k, Temp; for(k=0; k<n; k++) { printf("%d ",A[k]); } printf("\n "); for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { if (A[i] > A[j]) { Temp = A[i]; A[i] = A[j]; A[j] = Temp; } for(k=0; k<n; k++) { printf("%d ",A[k]); } printf("\n "); } } return; } int main() { int A[6]= {3,78,4,52,34,1}; int n = 6; SelSort( A, n); return 0; }
插入排序(Insertion sorting)
#include <stdio.h> #include <stdlib.h> #include <string.h> void InSort(int A[], int n) //插入排序法之副程式 { int i, j, k, Temp; for (i = 1; i < n; i++) { for(k=0; k<n; k++) { printf("%d ",A[k]); } printf("\n "); Temp=A[i]; j=i-1; while (Temp<A[j]) { A[j+1]=A[j]; A[j]=Temp; j--; for(k=0; k<n; k++) { printf("%d ",A[k]); } printf("\n "); if(j==-1) break; } A[j+1]=Temp; } return; } int main() { int A[6]= {3,78,4,52,34,1}; int n = 6; InSort( A, n); return 0; }
快速排序(Quick sorting)
#include <stdio.h> #include <stdlib.h> #include <string.h> #define n 6 //特別用此n的目的是要印出排序法的過程給大家看,然而程式碼中的right是會變動的,所以另外定義n為6(代表本序列的大小) void QuickSort(int A[], int left, int right) { int i, j, p, k, Temp; if(left < right) { p = A[(left+right)/2]; //pivot→其取點位置是可以自行定義的,有些人是直接取right當作pivot printf("pivot = %d\n",p); i = left - 1; j = right + 1; for(k=0; k<n; k++) { printf("%d ",A[k]); } printf("\n "); while(1) { while(A[++i] < p); // 向右找 while(A[--j] > p); // 向左找 if(i >= j) break; Temp = A[i]; A[i] = A[j]; A[j] = Temp; } for(k=0; k<n; k++) { printf("%d ",A[k]); } printf("\n "); QuickSort(A, left, i-1); // 對左邊進行遞迴 QuickSort(A, j+1, right); // 對右邊進行遞迴 } return; } int main() { int A[6]= {3,78,4,52,34,1}; int left = 0,right = 5; QuickSort( A, left, right); system("pause"); return 0; }
- 以right當作pivot的範例,這裡需注意:right在
QuickSort(A, left, i-1);
其值會漸漸往左邊靠攏,這是因為i-1的關係,等等大家可以看圖了解會更清楚
#include <stdio.h> #include <stdlib.h> #include <string.h> #define n 6 //特別用此n的目的是要印出排序法的過程給大家看,然而程式碼中的right是會變動的,所以另外定義n為6(代表本序列的大小) void QuickSort(int A[], int left, int right) { int i, j, p, k, Temp; if(left < right) { p = A[right]; //pivot→取位置為最後面一個的例子 printf("pivot = %d\n",p); i = left - 1; j = right + 1; for(k=0; k<n; k++) { printf("%d ",A[k]); } printf("\n "); while(1) { while(A[++i] < p); // 向右找 while(A[--j] > p); // 向左找 if(i >= j) break; Temp = A[i]; A[i] = A[j]; A[j] = Temp; } for(k=0; k<n; k++) { printf("%d ",A[k]); } printf("\n "); QuickSort(A, left, i-1); // 對左邊進行遞迴 QuickSort(A, j+1, right); // 對右邊進行遞迴 } return; } int main() { int A[6]= {3,78,4,52,34,1}; int left = 0,right = 5; QuickSort( A, left, right); system("pause"); return 0; }
堆積排序(Heap sorting)
薛爾排序(Shell sorting)
合併排序(Merge sorting)
沒有留言:
張貼留言