程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c/c++ 算法之快速排序法 冒泡排序法,選擇排序法,插入排序法

c/c++ 算法之快速排序法 冒泡排序法,選擇排序法,插入排序法

編輯:C++入門知識

本文詳細敘述和實現了快速排序算法,冒泡排序 選擇排序 插入排序比較簡單,原理在這裡不再詳述,直接用代碼進行了實現。

快速排序法(quicksort)是目前所公認最快的排序方法之一(視解題的對象而定),雖然快速排序法在最差狀況下可以達O(n2),但是在多數的情況下,快速排序法的效率表現是相當不錯的。快速排序法的基本精神是在數列中找出適當的軸心,然後將數列一分為二,分別對左邊與右邊數列進行排序,而影響快速排序法效率的正是軸心的選擇。
這邊所介紹的第一個快速排序法版本,是在多數的教科書上所提及的版本,因為它最容易理解,最符合軸心分割與左右進行排序的概念,適合對初學者進行講解。

解法這邊所介紹的快速演算如下:將最左邊的數設定為軸,並記錄其值為s
廻圈處理:
令索引i 從數列左方往右方找,直到找到大於s 的數
令索引j 從數列左右方往左方找,直到找到小於s 的數
如果i>=j,則離開回圈
如果i<j,則交換索引i與j兩處的值
將左側的軸與j 進行交換
對軸左邊進行遞回
對軸右邊進行遞回
透過以下演算法,則軸左邊的值都會小於s,軸右邊的值都會大於s,如此再對軸左右兩邊進行
遞回,就可以對完成排序的目的,例如下面的實例,*表示要交換的數,[]表示軸:
[41] 24 76* 11 45 64 21 69 19 36*
[41] 24 36 11 45* 64 21 69 19* 76
[41] 24 36 11 19 64* 21* 69 45 76
[41] 24 36 11 19 21 64 69 45 76
21 24 36 11 19 [41] 64 69 45 76

算法實現c/c++版:


/*快速排序法
sort 函數說明,添加者 Steve;
left:數組a的最小下標;
right:數組a的最大下標;
a[]:數組;
N:數組長度
*/

 void  sort(int left,int right ,int a[],int N)
 {
  if (left<right)
  {
   int al=left;
   int ar=right+1;
   int aleft=a[left];
 
   while(1)
   {
    while((al+1<N)&&(aleft>a[++al]));
 
    while((ar-1>-1)&&(aleft<a[--ar]));
    if (al>=ar)
    {
     break;
    }
 
    int temp=a[al];
    a[al]=a[ar];
    a[ar]=temp;
         }
 
  a[left]=a[ar];
  a[ar]=aleft;
 
   sort(left,ar-1,a,N);
   sort(ar+1,right,a,N);
 
  }
 
 }


//冒泡排序法

 void bufferSort(int a[],int N)
 {
  for (int i=0;i<N-1;i++)
   for(int j=0;j<N-i-1;j++)
  {
   if (a[j]>a[j+1])
   {
    int temp=a[j];
    a[j]=a[j+1];
    a[j+1]=temp;
   }
  
  }

 }

//選擇排序法
 void SelectSort(int a[],int N)
 {
  for (int i=0;i<N-1;i++)
  {
     int Min=a[i];
     int index=i;

   for(int j=i+1;j<N;j++)
      if (Min>a[j])
      {
    Min=a[j];
    index=j;
      }
   a[index]=a[i];
   a[i]=Min;
 
  }
 }

 

//插入排序法

 void inserSort(int a[],int N)
 {
  for ( int i=1;i<N;i++ )
  {
   int temp=a[i];
  int  j=i-1;
   while(temp<a[j])
   {
    a[j+1]=a[j];
  
    j--;
    if(j<0)
     break;

   }
    a[j+1]=temp;
  }
 }
 int _tmain(int argc, _TCHAR* argv[])
 {
  int a[]={-2,3,4,-9};
 
  cout<<" 排序前"<<endl;
  for (int i=0;i<4;i++)
  {
   cout<<a[i]<<" ";
  }
  cout<<endl<<"排序後"<<endl;
  //sort(0,3,a,4);//快速排序
   // bufferSort(a,4);//冒泡排序
    // SelectSort(a,4);//選擇排序
 inserSort(a,4);
  for (int i=0;i<4;i++)
  {
   cout<<a[i]<<" ";
  }
  return 0;
 }

 

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