插入排序

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 #include <stdio.h>

 void insert(char s[])
 {
 int i,j,t;
 for (i=1;i<=9;i++)
 {
 t=s[i];j=i-1;
 while ((j>=0)&&(t<s[j]))
 {
 s[j+1]=s[j];
j--;
 }
 s[j+1]=t;
 }
 }

 main()
 {
 char a[11];int i;
 for (i=0;i<10;i++)
 a[i]=getchar();
 a[i]='/0';
insert(a);
 puts(a);
 } 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第一次循環i=1,j=0 這個時候t=s[1]

是第二個數 s[j]是第一個數 

如果t<s[j]就是第二個數比第一個數小的話 s[j+1]=s[j] 把第一個數附給第二個數 

然後j-- 這個時候s[j+1]就是原來的s[j] s[j+1]=t

就是把第一個數的值設爲

這邊相當於一個數值的換位 

前一位是a,後一位是bt=b 

如果後面一位小於前面一位,

就要交換 b=a; a=t; 這樣就換好了 

算法:

一般來說,插入排序都採用in-place在數組上實現。具體算法描述如下:

  1. 從第一個元素開始,該元素可以認爲已經被排序 

  2. 取出下一個元素,在已經排序的元素序列中從後向前掃描  

   3. 如果該元素(已排序)大於新元素,將該元素移到下一位置 

  4. 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置 

  5. 將新元素插入到下一位置中  

   6. 重複步驟  如果比較操作的代價比交換操作大的話,可以採用二分查找法來減少比較操作的數目。

該算法可以認爲是插入排序的一個變種,稱爲二分查找排序。 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

C語言實現直接插入排序算法

插入排序(Insertion Sort)的基本思想是:每次將一個待排序的記錄按其關鍵字大小插入到前面已經排好序的子文件中的適當位置,直到全部記錄插入完成爲止。
有兩種插入排序方法:直接插入排序和希爾排序。

直接插入排序

1)基本思想
假設待排序的記錄存放在數組R[1..n]中。初始時,R[1]自成一個有序區,無序區爲R[2..n]。從i=2 起直至i=n 爲止,依次將R[i]插入當前的有序區R[1..i1]中,生成含個記錄的有序區。

2)第i趟直接插入排序
通常將一個記錄R[i](i=2,3,,n1)插入到當前的有序區,使得插入後仍保證該區間裏的記錄是按關鍵字有序的操作,稱爲第i-1 趟直接插入排序。
排序過程的某一中間時刻,被劃分成兩個子區間R[1..i1](已排好序的有序區)和R[i..n](當前未排序的部分,可稱無序區)。
直接插入排序的基本操作是將當前無序區的第個記錄R[i]插入到有序區R[1..i1]中適當的位置上,使R[1..i]變爲新的有序區。因爲這種方法每次使有序區增加個記錄,通常稱增量法。插入排序與打撲克時整理手上的牌非常類似。摸來的第張牌無需整理,此後每次從桌上的牌(無序區)中摸最上面的張並插入左手的牌(有序區)中正確的位置上。爲了找到這個正確的位置,需自左向右(或自右向左)將摸來的牌與左手中已有的牌逐一比較。 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

void Insert_Sort(int n) {

    int i, j;

    for(i=2; i<=n; i++)

        if(R[i] < R[i-1]) {

            R[0] = R[i];

            j = i - 1;

            do {

                R[j+1] = R[j];

                j--;

            } while (R[0] < R[j]);

            R[j+1] = R[0];

        }

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

完整代碼

#include <stdio.h>

#define M 100

int R[M];

void Insert_Sort(int n) {

    int i, j;

    for(i=2; i<=n; i++) {

        if(R[i] < R[i-1]) {

            R[0] = R[i];

            j = i - 1;

            do {

                R[j+1] = R[j];

                j--;

            } while (R[0] < R[j]);

            R[j+1] = R[0];

        }

    }

}

int main() {

    int i, n;

    puts("Input total element number of the sequence:");

    scanf("%d", &n);

    if(n <= 0 || n > M) {

        printf("n must more than 0 and less than %d./n", M);

        return 0;

    }

    puts("Input the elements one by one:");

    for(i=1; i<=n; i++)

        scanf("%d", &R[i]);

    puts("The sequence you input is:");

    for(i=1; i<=n; i++)

        printf("%4d", R[i]);

    Insert_Sort(n); // 直接插入排序

    puts("/nThe sequence after insert_sort is:");

    for(i=1; i<=n; i++)

        printf("%4d", R[i]);

    return 0;

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                                                                                      海譯翻譯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章