陣列的運算 和 兩種排序
阿新 • • 發佈:2021-10-31
1.陣列的初始化
2.陣列的賦值操作
3.陣列在函式中的傳入
4.選擇排序
思路:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。
重複第二步,直到所有元素均排序完畢。
#include<stdio.h> int min(int*, int); int main(void) { int a[] = { 2,45,6,12,87,34,90,24,23,11,65 }; int len = sizeof(a) / sizeof(a[0]); //這個操作可以很方便的得到陣列的長度int j = 0; for (int i = len - 1; i > 0; i--) { int minid = min(a, len);//得到陣列中最小的元素的下標 int t = a[minid]; a[minid] = a[j]; a[j] = t;//將最小元素與第j個元素交換 j++;//交換後將j的數字加1,即進入下一個數字的排序 } for (int i = 0; i < len; i++) {//輸出陣列 printf("%d ", a[i]); }return 0; } int min(int* a, int len) { static int j = 0; //這裡定義一個靜態區域性變數,目的是讓排好的元素不加入最小值的比較 int minid = len - 1; for (int i = j; i < len; ++i) { if (a[i] < a[minid]) { minid = i; } } j++; return minid; }
5.氣泡排序
思路:依次比較相鄰的兩個數,將比較小的數放在前面,比較大的數放在後面。
(1)第一次比較:首先比較第一和第二個數,將小數放在前面,將大數放在後面。
(2)比較第2和第3個數,將小數 放在前面,大數放在後面。
......
(3)如此繼續,知道比較到最後的兩個數,將小數放在前面,大數放在後面,重複步驟,直至全部排序完成
(4)在上面一趟比較完成後,最後一個數一定是陣列中最大的一個數,所以在比較第二趟的時候,最後一個數是不參加比較的。
(5)在第二趟比較完成後,倒數第二個數也一定是陣列中倒數第二大數,所以在第三趟的比較中,最後兩個數是不參與比較的。
(6)依次類推,每一趟比較次數減少依次
//氣泡排序 void sort(int * a, int len) { int i, j, t; for (i=0; i<len-1; ++i) {//總的比較次數 for (j=0; j<len-1-i; ++j) { //迴圈判斷條件中的len-1-i則是為了使得排好的元素不參與比較 if (a[j] > a[j+1]) // >表示升序 <表示降序 { //將兩個相鄰陣列元素進行比較,並將最大的元素放到最後面 t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } }