1. 程式人生 > >嵌入式Linux C程式設計學習之路(五)——基礎排序演算法

嵌入式Linux C程式設計學習之路(五)——基礎排序演算法

      在進行排序演算法時經常用到交換兩個陣列元素的功能,將這個功能單獨寫成一個子函式,採用傳引用呼叫的引數傳遞方式,對陣列元素的地址直接進行操作,達到改變其位置的功能。程式碼如下:

void swap(int*p,int*q)
{
  int a;
  a=*p;
  *p=*q;
  *q=a;
}

一:選擇排序
    將要排序的物件分作兩部份,一個是已排序的,一個是未排序的,從後端未排序部份選擇一個最小值,並放入前端已排序部份的最後一個。

void slef(int a[])
{ int i,j,k;
  for(i=0;i<9;i++)//選擇第i位,將其他位依次與他相比較
        {
          for(j=1+i;j<10;j++)//其他位選擇
            {
              if(a[j]<=a[i])//當其他的位存在比第i位小的數時,
                {swap(&a[j],&a[i]);//交換

                }
            }
          printf("第 %d 次排序:", i+1);
           for(k = 0; k < 10; k++)
           printf("%d ", a[k]);
           printf("\n");
        }
}

執行結果如下: 

[[email protected] paixu]# ./a.out 
4
第 1 次排序:6 95 90 49 80 58 27 9 18 50 
第 2 次排序:6 9 95 90 80 58 49 27 18 50 
第 3 次排序:6 9 18 95 90 80 58 49 27 50 
第 4 次排序:6 9 18 27 95 90 80 58 49 50 
第 5 次排序:6 9 18 27 49 95 90 80 58 50 
第 6 次排序:6 9 18 27 49 50 95 90 80 58 
第 7 次排序:6 9 18 27 49 50 58 95 90 80 
第 8 次排序:6 9 18 27 49 50 58 80 95 90 
第 9 次排序:6 9 18 27 49 50 58 80 90 95 

二:插入排序
       像是玩樸克一樣,我們將牌分作兩堆,每次從後面一堆的牌抽出最前端的牌,然後插入前面一堆牌的適當位置。 

void ins(int a[])
{
  int i,j,k,tmp;
  for(j = 1; j < 10; j++)
    {
      tmp = a[j];
  i=j;
  while(tmp<a[i-1])
    {
      swap(&a[i],&a[i-1]);
      i--;
      if(0==i)
        break;
    }

  printf("第 %d 次排序:", j);
  for(k = 0; k < 10; k++)
  printf("%d ", a[k]);
  printf("\n");
  }
}

執行結果如下: 

[[email protected] paixu]# ./a.out 
5
第 1 次排序:27 95 90 49 80 58 6 9 18 50 
第 2 次排序:27 90 95 49 80 58 6 9 18 50 
第 3 次排序:27 49 90 95 80 58 6 9 18 50 
第 4 次排序:27 49 80 90 95 58 6 9 18 50 
第 5 次排序:27 49 58 80 90 95 6 9 18 50 
第 6 次排序:6 27 49 58 80 90 95 9 18 50 
第 7 次排序:6 9 27 49 58 80 90 95 18 50 
第 8 次排序:6 9 18 27 49 58 80 90 95 50 
第 9 次排序:6 9 18 27 49 50 58 80 90 95 

三:氣泡排序法
       顧名思義,就是排序時,最大的元素會如同氣泡一樣移至右端,其利用比較相鄰元素的方法,將大的元素交換至右端,所以大的元素會不斷的往右移動,直到適當的位置為止。

void paos(int a[])
{
  int i,j,k,f=1;
  for(j=0;j<9&&f==1;j++)
    {f=0;
 for(i=0;i<9-j;i++)
   {
     if(a[i]>a[i+1])
       {
       swap(&a[i],&a[i+1]);
       f=1; }
   }
      printf("第 %d 次排序:",j+1);
        for(k = 0; k < 10; k++)
        printf("%d ", a[k]);
        printf("\n");
    }

}

執行結果如下 :

[[email protected] paixu]# ./a.out 
6
第 1 次排序:27 90 49 80 58 6 9 18 50 95 
第 2 次排序:27 49 80 58 6 9 18 50 90 95 
第 3 次排序:27 49 58 6 9 18 50 80 90 95 
第 4 次排序:27 49 6 9 18 50 58 80 90 95 
第 5 次排序:27 6 9 18 49 50 58 80 90 95 
第 6 次排序:6 9 18 27 49 50 58 80 90 95 
第 7 次排序:6 9 18 27 49 50 58 80 90 95 

      氣泡排序時,當某次排序不發生陣列元素交換時,則排序位完成,這是即可終止排序以減少程式執行時間,程式碼中通過設定一個標誌符f來判斷是否產生交換。

附:主函式

int main()
{   int b=0;
    int a[10]={95,27,90,49,80,58,6,9,18,50};
    scanf("%d",&b);
    if(4==b)
      {
        slef(a);
      }
    if(5==b)
      {
        ins(a);
      }
    if(6==b)
      {
        paos(a);

      }
    else

      {
    return 0;
      }
}

相關推薦

嵌入式Linux C程式設計學習——基礎排序演算法

      在進行排序演算法時經常用到交換兩個陣列元素的功能,將這個功能單獨寫成一個子函式,採用傳引用呼叫的引數傳遞方式,對陣列元素的地址直接進行操作,達到改變其位置的功能。程式碼如下: void swap(int*p,int*q) { int a; a=*p;

嵌入式Linux C程式設計學習十三——標準IOgets,puts,fprintf,sprintf,fgetc,fputc

1. gets & puts //是行快取的讀寫函式 char *gets(char*s); int puts(constchar *s); gets 與fgets的區別: Ø  gets()不能指定快取的長度,這樣就可能造成快取越界(如若該行長於快取長度

嵌入式Linux C程式設計學習—— Open/Close函式

1. input & output:站在應用層考慮 Input:核心-->使用者,從核心讀取資料或從檔案讀取資料 ————read函式 Output:使用者-->核心,寫資料到核心或寫資料到檔案中 ————write函式 2. 核心中檔案太多了,寫到

嵌入式Linux C程式設計學習——標準IO fopen/fclose

標準IO與檔案IO的對應函式 檔案IO:                                             標準IO open                                                 fopen close

嵌入式Linux C程式設計學習——初識GCC

       Gcc(GNU C Compiler)是GNU推出的功能強大、效能優越的多平臺編譯器,是GNU的代表作之一。Gcc可以在多種硬體平臺上編譯出可執行程式,其執行效率與一般的編譯器相比平均效率要高20%~30%。       Gcc最基本的用法是∶gcc [opt

嵌入式Linux C程式設計學習——常用命令彙總1

一、使用者管理類命令 1:格式:useradd [選項] 使用者名稱 useradd kkkw   -新增名字為kkkw的使用者,當用戶建立成功後,會在/home/ 目錄下生成與使用者名稱同名的目錄 [root@loc home]# useradd kkkw [roo

C++再學習

我們 實參 對象傳遞 color virtual 轉換 版本 部分 尊重 1.繼承和動態綁定在兩個方面簡化了我們的程序   能夠容易地定義與其他類相似但又不相同的新類,能夠更容易地編寫忽略這些相似類型之間區別的程序  P471 2.之所以稱通過繼承而相關聯的類型為多態類型,

C++再學習

iter pointer lin clas 數組元素 對數 表達 自增 條件操作符 1. 移位操作符“ << ”和“ >> ”擁有中等優先級:其優先級比算術操作符低,但比關系操作符、賦值操作符和條件操作符優先級高 2. *iter++   後自增操作

非同步程式設計學習-多執行緒之間的協作與通訊

本文是非同步程式設計學習之路(三)-多執行緒之間的協作與通訊,若要關注前文,請點選傳送門: 非同步程式設計學習之路(二)-通過Synchronize實現執行緒安全的多執行緒 通過前文,我們學習到如何實現同步的多執行緒,但是在很多情況下,僅僅同步是不夠的,還需要執行緒與執行緒協作(通訊),生產

非同步程式設計學習-通過Synchronize實現執行緒安全的多執行緒

本文是非同步程式設計學習之路(二)-通過Synchronize實現執行緒安全的多執行緒,若要關注前文,請點選傳送門: 非同步程式設計學習之路(一)-通過Thread實現簡單多執行緒(執行緒不安全) 上篇我們通過Thread實現了幾種執行緒不安全的多執行緒寫法,導致最後的結果與預期的值不一樣。

非同步程式設計學習-通過Thread實現簡單多執行緒

自上週主管帶我看過kafka內部實現,使用Feature來做的資料批量傳送之後,自此決定要學好併發程式設計。 因為本人在多執行緒上只能說是一個新手,打算從最底層的Thread一步一步記錄我的學習之路。 通過Thread實現多執行緒的方式有兩種,程式碼如下: 一、多執行緒實現(繼承Thre

Linux命令列學習

全為自己總結歸納所得,有不對的地方敬請指出。 首先,我們先來總結一下一些較為實用的命令列快捷鍵 Ctrl+L :清理終端,可以將終端清空 Ctrl+C:中斷當前命令 Shift+PgUp : 向上翻頁,可以檢視以前在命令列中顯示的內容 Shift+PgDn : 向

Linux命令列學習——定時執行

對於一些命令我們並不是想讓其馬上執行,而是等待一定時間或者到某個時間再執行,我們需要怎麼做? at命令:延時執行一個程式(通過:apt-get install at 進行安裝) 命令使用方法: 1、輸入:at 【時間】   這個時間可以是具體的時間,例如:at  15:

Linux命令列學習——重定向和管道

今天我們來總結一下個人認為linux下最為實用和厲害的重定向和管道 在說今天的重點之前,必須要先學一點其他的新知識:標準輸入(stdin)、標準輸出(stdout)、標準錯誤輸出(stderr) 標準輸入(stdin):程式碼為0,使用<或<<   輸入

Hibernate學習

ring int 表示 gen prop generator 需要 blog hibernate 簡述 多對多關系映射 多對多關系映射需要一張中間表來維護關系      一:Role類與Function類 1 publi

PHP學習

設有 src fault ... 根據 條件判斷 滿足 循環 獲取 2017.08.13 Day 5  周日  晴 PHP-順序結構 順序結構就像一條直線,按著順序一直往下執行。我們編寫的代碼默認都是按照順序結構執行的。 PHP條件結構之if…else… 條件結

MySQL學習MySQL高級查詢

code left 功能 限定查詢 外鏈接 spa size 平均數 asc MySQL統計函數   count():統計數量;   max():統計最大值;   min():統計最小值;   avg():統計平均數;   sum():統計和; Select

Hadoop學習Hadoop集群搭建模式和各模式問題

數據 場景 模式 問題 沒有 問題: 重裝 故障 style 分布式集群的通用問題 當前的HDFS和YARN都是一主多從的分布式架構,主從節點---管理者和工作者 問題:如果主節點或是管理者宕機了。會出現什麽問題? 群龍無首,整個集群不可用。所以在一主多從的架構中都會

Python學習 爬蟲正則表示式爬去名言網

auth Python標準庫 我們 color 匯總 eight code 比較 school 爬蟲的四個主要步驟 明確目標 (要知道你準備在哪個範圍或者網站去搜索) 爬 (將所有的網站的內容全部爬下來) 取 (去掉對我們沒用處的數據) 處理數據(按照我們想要的

Hive學習 DbVisualizer配置連接hive

ado lan inf files AD sha comm HR 下載地址 一、安裝DbVisualizer 下載地址http://www.dbvis.com/ 也可以從網上下載破解版程序,此處使用的版本是DbVisualizer 9.1.1 具體的安裝步驟可以百度,