連載3---第2章:開始(2.1:插入排序)

2.1:插入排序

       插入排序就比較形象的例子就是我們玩牌中"抓牌並插牌"的操作,我們左有拿牌,右手抓牌,抓完後要向左手已經有的牌中插入合適的位置,找合適的位置有兩種順序,從大到小找,或者從小到大找.

       比較通俗的說法,插入排序就是把一個個數插入到已經排好序的序列中

       定義插入排序作爲一個過程:INSERTION-SORT,這個過程有一個參數:數組A[1-n],過程執行完後數組A是一個排完序的數組

       先用僞代碼寫一遍算法過程

       INSERTION-SORT(A)

            for j<---2 to length[A]

                 do key<---A[j]

                 插入A[j]到已經排好序的序列中(A[1---(j-1)]),從後往前找出位置,然後插入相應的位置位置

                 i<---j-1

                 while i>0 and A[i]>key

                       do A[i+1]<---A[i]

                             i<---i-1

                 A[i+1]<---key

以下是c語言調試的算法(注意數組的下標是從0開始的):

#include <stdio.h>

#define N 6

void INSERTION_SORT();

void INSERTION_SORT(int A[N])
{
 int i;
 int j;
 int k;
 int key;

 printf("start run INSERTION_SORT()/n");
 
 for(j=1;j<N;j++)
 {
  key=A[j];      /*找出當前要插入的數*/
  i=j-1;                 /*從當前要插入的數的前一個位置開始查*/
  while(i>=0&&A[i]>key)  /*找出要插入的位置,從後往前找*/
  {
   A[i+1]=A[i];       /*找的過程中同時換位置*/
   i=i-1;
  }
  A[i+1]=key;      /*把數插入到找到的位置*/
  
  printf("the %d time SORT(%d)/n",j,key);
  for(k=0;k<N;k++)
  {
   printf("%d/t",A[k]);
  }
  printf("/n");
 } 
 
 printf("end run INSERTION_SORT()/n");
}

void main()
{
 int i;
 static int a[N]={50,20,40,60,10,30};

 printf("start run main/n");
 printf("before SORT/n");
 /*排序前*/
 for(i=0;i<N;i++)
 {
  printf("%d/t",a[i]);
 }
 printf("/n");

 INSERTION_SORT(a);

 /*排序後*/
 printf("after SORT/n");
 for(i=0;i<N;i++)
 {
  printf("%d/t",a[i]);
 } 
 printf("/n");

 printf("end run main/n");
}

看執行結果:

習題:
1.寫出用插入排序實現一組數的排序過程:31,41,59,26,41,58
答:31,41,59,26,41,58
   31,41,59,26,41,58
   26,31,41,59,41,58
   26,31,41,41,59,58
   26,31,41,41,58,59
2.重新寫插入排序算實現"非遞減"算法
3.考慮下面的搜索問題
  輸入:一組數,一共n個,A=a1,a2,a3.....,an 和v
  輸出:下表i,使v=A[i]如果序列中沒有,則找出最接近的那個
  寫出搜索算法,證明算法的正確性
4.考慮兩個n位數相加的問題,兩個n位數分別存在兩個n元素數組A和B中,結果存在n+1元素的數組中

發佈了31 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章