~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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
就是把第一個數的值設爲t
這邊相當於一個數值的換位
前一位是a,後一位是b,t=b
如果後面一位小於前面一位,
就要交換 b=a; a=t; 這樣就換好了
算法:
一般來說,插入排序都採用in-place在數組上實現。具體算法描述如下:
1. 從第一個元素開始,該元素可以認爲已經被排序
2. 取出下一個元素,在已經排序的元素序列中從後向前掃描
3. 如果該元素(已排序)大於新元素,將該元素移到下一位置
4. 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
5. 將新元素插入到下一位置中
6. 重複步驟2 如果比較操作的代價比交換操作大的話,可以採用二分查找法來減少比較操作的數目。
該算法可以認爲是插入排序的一個變種,稱爲二分查找排序。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C語言實現“直接插入排序”算法 |
直接插入排序
(1)基本思想
假設待排序的記錄存放在數組R[1..n]中。初始時,R[1]自成一個有序區,無序區爲R[2..n]。從i=2 起直至i=n 爲止,依次將R[i]插入當前的有序區R[1..i−1]中,生成含n 個記錄的有序區。
(2)第i−1 趟直接插入排序
通常將一個記錄R[i](i=2,3,…,n−1)插入到當前的有序區,使得插入後仍保證該區間裏的記錄是按關鍵字有序的操作,稱爲第i-1 趟直接插入排序。
排序過程的某一中間時刻,R 被劃分成兩個子區間R[1..i−1](已排好序的有序區)和R[i..n](當前未排序的部分,可稱無序區)。
直接插入排序的基本操作是將當前無序區的第1 個記錄R[i]插入到有序區R[1..i−1]中適當的位置上,使R[1..i]變爲新的有序區。因爲這種方法每次使有序區增加1 個記錄,通常稱增量法。插入排序與打撲克時整理手上的牌非常類似。摸來的第1 張牌無需整理,此後每次從桌上的牌(無序區)中摸最上面的1 張並插入左手的牌(有序區)中正確的位置上。爲了找到這個正確的位置,需自左向右(或自右向左)將摸來的牌與左手中已有的牌逐一比較。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~