程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 優秀算法系列--排序算法(一)

優秀算法系列--排序算法(一)

編輯:關於C語言

 排序算法是我們常用算法之一,也是計算機程序設計中的一種重要操作,它的功能是將一個數據元素(或記錄)的任意序列,重新排列成一個關鍵字有序的序列。排序過程中涉及的存儲器不同,可將排序方法分為兩大類:一類是內排序,指的是待排序記錄存放在計算機隨機存儲器中進行的排序過程,內排序有:插入排序、希爾排序、交換排序、快速排序、選擇排序等;另一類是外排序,指的是待排序記錄的數量很大,以致內存一次不能容納全部記錄,在排序過程中尚需對外存進行訪問的排序過程。

    下面說一下交換排序,交換排序主要有:冒泡排序和快速排序,快速排序(Quicksort)其實是對冒泡排序的一種改進。

     為了方便描述,使用順序表類型定義如下:

#define MAXSIZE 1000
typedef int KeyType;
typedef struct {
         KeyType key;
         InfoType otherinfo;
}RecType;

typedef struct {
         RecType r[MAXSIZE+1];
         int length;
}SqList;
  

冒泡排序
基本概念是:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。整個排序過程最多執行n-1趟,它是一種穩定的算法。

  C Code:

void BubbleSort(SqList &q)
{
int j,h,p=q.length-1,temp;
for(h=1;h<=p;)
  for(j=0;j<p-1;j++)
    if(q.r[j].Key>q.r[j+1].key)
     {
      temp=q.r[j];
      q.r[j]=q.r[j+1];
      q.r[j+1]=temp;
      p=j
     }
}
  冒泡排序法存在這不足,當排序的數據比較多時排序的時間會明顯延長。具體做法:任意選取某一記錄(通常取第一個記錄),比較其關鍵字與所有記錄的關鍵字,並將關鍵字比它小的記錄全部放在它的前面,將比它大的記錄均存放在它的後面,這樣,經過一次排序之後,可將所有記錄以該記錄所在的分界點分為兩部分,然後分別對這兩部分進行快速排序,直至排序完 ,這就是改進的方法:快速排序。

快速排序
     設要排序的數組是a[0]……a[n-1],

      一趟快速排序的算法是:

  1)設置兩個變量low、high,排序開始的時候:low=0,low=n-1;

  2)以第一個數組元素作為關鍵數據,賦值給key,即 key=a[0];

  3)從J開始向前搜索,即由後開始向前搜索(high=high-1),找到第一個小於key的值a[high],並與a[low]交換;

  4)從I開始向後搜索,即由前開始向後搜索(low=low+1),找到第一個大於key的a[low],與a[high]交換;

  5)重復第3、4、5步,直到 low=high;

      示意圖:

 \

C Code:

void QuickSort(SqList &R ,int s,int t)
{
   int low, high,Key;
   low=s;
   high=t;
   Key=R.r[s].key;
   R.r[0]=R.r[s];
   while(low<high)
    {
        while(high>low&&R.r[high].key>Key)
          high--;
        if(low<high)
        {
         R.r[low]=R.r[high];
         low++;
         }
        while(low<high&&R.r[high].key<=Key)
         ++low;
        if(low<high)
        {
         R.r[high]=R.r[low];
         high--;
         }
    }
    R.r[low]=R.r[0];
    QuickSort(R,s,low-1);
    QuickSort(R,low+1,t);
}
  好了,就先說到這裡了。

 作者“flute的專欄”
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved