數組常用排序,尋找演算法_演算法

來源:互聯網
上載者:User

一:數組常用排序演算法:

1):冒泡排序(Bubble sorting)

演算法思想: 相鄰2個數比較大小,小者往前移動,一趟比較完後,最小的數冒到最前面,較 

                  大的數(重者)慢慢沉下去,排列到數組的後面.如果有n個數,經過n-1趟比  

                   較,數組中的數便已經排序(升序)的數。

程式碼:

void bubble_sort(int arr[],int size)

{
    int temp,flag;
    int i,j;
    for(int i=0;i<size;i++)
   {
        flag=0;
        for(int j=size-1;j>i;j--)
        {
         if(arr[j]<arr[j-1])
         {
          temp=arr[j];
          arr[j]=arr[j-1];
          arr[j-1]=temp;
          flag=1;
         }
        }
        if(flag==0)break;
   }
}


2):交換排序(Swap sorting)

演算法思想:

         第1個元素的值與後面的所有元素的值比較大小,如果其中一個值比第1個值   

          小,進行交換。領獎類推,再將第2個元素與後面的所有元素比較交換,直到

           n-1個元素為止。

程式碼:

void swap_sort(int arr[],int size)
{
 int temp;
 int i,j;
 for(i=0;i<size;i++)
  for(j=i+1;j<size;j++)
   if(arr[j]<arr[i])
   {
    temp=arr[i];
    arr[i]=arr[j];
    arr[j]=temp;
   }
}

3):選擇排序(Select sorting)

演算法思想:

        交換排序有一個缺點:如果數列後面的資料比前面的資料小,每一趟比較都會

         產生多次無謂的交換,浪費系統時間。選擇排序的基本思想是:若有n個數,假

         設第1位存放最小的數,將此數與後面的所有數進行比較。用下標變數k來記錄

         最小數所在的元素的下標。一趟比較完成後,將arr[0]與arr[k]進行交換。然後設

         第2位存放次小的數,依次類推。

程式碼:

void select_sort(int arr[],int size)
{
 int i,j,k;
 int temp;
 for(i=0;i<size;i++)
 {
  k=i;
  for(j=i+1;j<size;j++)
   if(arr[j]<arr[k])
    k=j;
   if(k!=i)
    temp=arr[i],arr[i]=arr[k],arr[k]=temp;
 }
}

4):直接插入排序(Insert sorting)

演算法思想:

         將第1個數視為有序序列,然後依次將後續各數逐個插入到該有序序列中。

程式碼:

void insert_sort(int arr[],int size)
{
 int i,j;
 int temp;
 for(i=1;i<size;i++)
 {
  temp=arr[i];
  for(j=i-1;j>=0;j--)
   if(temp<arr[j])
    arr[j+1]=arr[j];
   else
    break;
  arr[j+1]=temp;
 }
}

二:數組的尋找演算法:

1):順序尋找

演算法思想:

         依照數組中元素的順序,依次進行比較,以尋找出元素的位置。

程式碼:

int SequenceSearch(int arr[],int key,int size)
{
 int i;
 for(i=0;i<size;i++)
  if(arr[i]==key)
   return i;
 return -1;
}

2):折半尋找

演算法思想:這種尋找方法是針對已經排序的數組進行的一個尋找方式,折半尋找極

                     大的提高了尋找的效能,但是它是以排序數組為代價來換的。

程式碼:

int BinarySearch(int arr[],int key,int size)
{
 int low=0,high-size-1,middle;
 int count=0;
 while(low<=high)
 {
  middle=(low+high)/2;
  count++;
  if(key==arr[middle]
  {
   printf("compare count=%d/n",count);
   return middle;
  }
  else if(key>arr[middle])
   low=middle+1;
  else
   high=middle-1;
 }
 printf("compare count=%d/n",count);
 return -1;
}

NOTE:針對兩個元素的交換位置不藉助中間變數的演算法:

void chang(int x,int y)
{
 x=x+y;
 y=x-y;
 x=x-y;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.