數組的運算 和 兩種排序


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; 
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM