基本排序演算法
阿新 • • 發佈:2018-12-11
文章目錄
氣泡排序法
氣泡排序法是最簡單的一種排序方法他的基本思想就是有一行數字讓他們左右相互比較(a<b)誰小或者誰大就往後面拍,如果這個if不成立就不變(這個是看你是從大往小排還是從小往大排),一直排到第n-1<n 個數然後再來幾次(次數由你由n個數定,你就排n-1次,因為你排序最差的情況就是最大的數再最後而你又要以最大的排排前面,這個數最多移動四位) 程式碼
#include <stdio.h> #define SIZE 5 int maopao(int *); int main(void) { int sz[SIZE] = {6,4,7,1,2}; for (int i = 0; i < 5; i++) { printf("%d\n",*(sz + i)); } maopao(sz); printf("----------------------------------------\n"); for (int j = 0; j < 5; j ++) { printf("%d\n",*(sz + j)); } return 0 ; } int maopao(int *sz) { for(int i = 0; i < 4; i++) { int n = 0; int m = 1; for (int j = m;j < 5;j ++) { if ( *(sz + n) < *(sz + j) ) { int tmp; tmp = * (sz + j); * (sz + j) = *(sz + n); *(sz + n) = tmp; } n++; } } return 0; }
maopao函式裡面,最裡面的for迴圈就是指定左右相互比較,外面的for迴圈式指定排幾次 優點
- 簡單好理解
- 缺點效率不高
選擇排序法
選擇排序法的思想也很簡單,就是首先找到最小的數字把他放到第一,然後再從接下來的數列中再找到最小的數字在放到第二。依次類推 ,和氣泡排序法一樣他的裡面的for迴圈是定義了取最小值,這個數字是n,因為要和最後一個數字作比較,而外面的for迴圈定義了一共區幾次,這個數字是n-1次(n位數字的個數,因為最後一次不用取他的對比數字已經超過陣列邊界了他自己就是陣列邊界)
#include <stdio.h> #define SIZE 8 void xzpx(int *); int main(void) { int sz[SIZE] = {5,3,2,8,5,6,9,0}; for(int i = 0 ; i<8; i++) { printf("%d\n", * ( sz + i ) ); } printf("----------------------------\n"); xzpx(sz); for(int j = 0;j < 8;j++) { printf("%d\n", * ( sz + j ) ); } return 0; } void xzpx(int * sz) { int tmp; for(int i = 0; i < 7; i++) { for(int j = i + 1; j < 8; j++) { if( *(sz + i) > *(sz + j) ) { tmp = *(sz + i); *(sz + i) = *( sz + j ); *(sz + j) = tmp; } } } } ~
優點:簡單 缺點:不穩定
插入排序法
插入排序法就是從第1個元素開始(就是外層迴圈),像前面比較大的排前面或者小的排前面,然後我們假定它已經按順序排好,然後我們再到第二個元素,再用第二個元素和前面一個的元素比誰打排前面或者誰小排前面,比完後我們再拿這個數(有可能已經改變了位子)再往前面比只到它出現再適合的位子,依次類推。
程式碼
#include <stdio.h> #define SIZE 10 void insertion_sorting(int *); int main(void) { int arry[SIZE] = {5,2,7,4,1,7,4,9,10,3}; int i; for(i = 0;i < 10;i++) { printf("%d\n",*(arry + i)); } printf("---------------------\n"); insertion_sorting(arry); for(i = 0;i < 10;i++) { printf("%d\n",*(arry + i)); } return 0; } void insertion_sorting(int *arry) { int i,j,n,tmp; for(j = 1;j <= SIZE;j++) { n = 0 ; for(i = j-1; i >= 0;i--) { if(*(arry + i) < *(arry + j - n) ) /*判斷前面一個元素是否大於後面的元素,如果大於就說明順序準確執行else就是break, 如果小於就交換順序,再拿這個元素和前面所 有的元素相比(注意這時候他的元素順序就已經 改變了,如何確定這個元素正確的位子我們就用 變數n,每交換一次n就+1讓源元素減去他如果到 正確的位子我們就會執行else也就是break)*/ { tmp = *(arry + i); *(arry + i) = *(arry + j - n); *(arry + j - n) = tmp; n++; } else { break; } } } } ~