直接插入排序c語言
Ⅰ 排序問題(c語言)
插入排序很簡單的,一共n個數,每次去第i個,與前面的i-1個比較,這i-1是排好序的。while內循環的作用就是把第i個數與前面的i-1個比較,所以j--的意思就是倒過去找。
要理解R[j+1]=temp,就要看懂temp的作用,temp用來暫時保存當前需要插入的數,也就是第[i]個,這樣把temp與前面每個數比較,直到找到不大於temp的,那麼在找到正確位置前,每次把隊伍向後排一位騰空一個位置,找到了的時候就是temp.key>=R[j].key,這時候j+1位置就是最終位置,把temp也就是目標數放進去。
上面我把temp當作一個數來說,省事,其實照你的程序看,它是一個record,記錄類型,我學的語言多了點,不記得C里是不是這么叫的,所以RecType就是一個記錄類型,C裡面是不是叫struct?它有一些成員,比如.key,程序里比較的就是.key
Ⅱ C語言插入法排序的解釋
直接插入排序的基本思想是:
當插入第i (i≥ 1) 個對象時,前面的V[0], V[1], …, v[i-1]已經排好序。這時,用v[i]的關鍵碼與v[i-1], v[i-2], …的關鍵碼順序進行比較,找到插入位置即將v[i]插入,原來位置上的對象向後順移。
演算法分析:
1.若設待排序的對象個數為curremtsize = n,則該演算法的主程序執行n-1趟。
2.關鍵碼比較次數和對象移動次數與對象關鍵碼的初始排列有關。
3.最好情況下,排序前對象已經按關鍵碼大小從小到大有序,每趟只需與前面的有序對象序列的最後一個對象的關鍵碼比較 1 次,移動 2 次對象,總的關鍵碼比較次數為 n-1,對象移動次數為 2(n-1)。
用c實現的插入排序法,先輸入10個數,然後利用插入排序法進行排序,將結果輸出。
#include "stdio.h"
#include "conio.h"
main()
{
int a[10],r[11];
int *p;
int i,j;
for(i=0;i<10;i++)
{
p=&a[i];
printf("please scan the NO:
%d\n",i);
scanf("%d",p);
r[i+1]=a[i];
}
r[0]=1;
for(i=2;i<=10;i++)
{
r[0]=r[i];
j=i-1;
while(r[j]>r[0])
{
r[j+1]=r[j];
j--;
}
r[j+1]=r[0];
}
for(i=1;i<=10;i++) {p=&r[i];printf("form min to max the NO: %d value=%d\n",i,*p);}
getch();
}
Ⅲ c語言如何把結構按其中的一個元素的大小用插入排序法排序
struct student { int id; // 編號 char name[NAME_LEN]; // 姓名 int gender; // '0'代表男性,'1'代表女性 Date birth; // 出生日期,格式 2010-11-23 double stature; // 身高,單位米 Study score; // 學習成績 char ID[18]; // 身份證 };typedef struct student Student;
void swap(Student *s,int i,int j)
{
Student tmp=s[i];
s[i]=s[j];s[j]=tmp;
}
void Insert(Student *s,int i)
{
Student tmp=s[i];
while(i>=1&&s[i].id<s[i-1].id)
{swap(s,i,i-1);i--;}
s[i]=tmp;
}
InsertSort(Student *s,int len)
{
for(i=1;i<len;i++)
Insert(s,i);
}
int main()
{
Student s[10];
InsertSort(s,10);
return 0;
}
請看上述答案。我想應該是你要的結果。
Ⅳ c語言直接插入排序比較次數和移動次數
插入排序,冒泡排序,簡單選擇排序和堆排序它們在最壞的情況下各需的比較次序依次是:n平方 n平方 n平方 nlogn
Ⅳ C語言的插入排序法是什麼
插入排序(insertion sort)
如果需要對一個小型數組進行升序排列,那麼可以選用插入排序,插入排序可以用打牌時對摸起的牌根據牌的點數來對其進行插入排列來描述。
可以把左手中的牌比做已經摸起的牌,即已經被排列好的牌,左手可以容納的牌數的空間可以假想為和要摸的牌的總數相同;而在桌子上的那部分沒摸的牌則是未被排序的牌,這二者的關系可以抽象為數組中已經被排序好的部分和未被排序好的部分。
一開始摸起的第一張牌不需要排序,可以認定其為已排序的牌。
如果用外層循環for來表示摸起的牌的話,則可以抽象為:
// 對象數組
// 桌子上的牌
int A[] = {5,1,3,6,2,4};
// 從數組的第二個元素開始抽取
for(int i = 1; i < sizeof A/sizeof A[0]; ++i)
{
int pick = A[i]; // 被摸起的牌
int j = i - 1; // j記錄已排序部分的最後一張牌的位置
. . .
}
而後摸起的排要根據排列策略和先前摸起的牌的點數的大小來確定其插入的合適位置,這里示範的排列策略是升序排列,摸起了這張牌後,便自右向左地和手中的牌進行比較。
把pick稱作摸起的牌,如果pick比手中的牌小,則手中較大的那張牌就向右挪一位,pick再和下一張牌做比較,如果下一張牌仍然比pick大,那麼那張牌便也向右移動一個位置,依此類推。
如果手中下一張和pick比較的牌比pick小,那麼pick就被插入在了手中前一張牌移動後空下的位置;
或者手中所有的牌都比pick大,那麼所有的牌就都向右移動過一個位置,所以pick最終被插入在了手中最左邊的位置。
這個過程可以抽象為:
// 對象數組
// 桌子上的牌
int A[] = {5,1,3,6,2,4};
// 從數組的第二個元素開始抽取
for(int i = 1; i < sizeof A/sizeof A[0]; ++i)
{
int pick = A[i]; // 被摸起的牌
int j = i - 1; // j記錄已排序部分的最後一張牌的位置
// 如果循環了j+1次,即j = -1時還未找到比pick小的牌
// 那麼pick就是最小的牌被插入在位置A[0]處
// A[j]是當前手中和pick進行比較的牌
while(j >= 0 && A[j] > pick)
{
// 未找到可插入位置,則A[j]向後挪一位
A[j+1] = A[j];
// j減1繼續向左定位手中下一張供和pick比較的牌--j;
}
// while結束後,j+1所表達的位置便是pick可以插入的位置
A[j+1] = pick;
}
// 對於有N個元素的數組A,採用插入排序法排序時,當外層循環進行了N-1次後排序完畢
Ⅵ c語言中插入排序的基本思想是什麼
插入排序(Insertion sort)是一種簡單直觀且穩定的排序演算法。如果有一個已經有序的數據序列,要求在這個已經排好的數據序列中插入一個數,但要求插入後此數據序列仍然有序,這個時候就要用到一種新的排序方法——插入排序法,插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,演算法適用於少量數據的排序,時間復雜度為O(n^2)。是穩定的排序方法。插入演算法把要排序的數組分成兩部分:第一部分包含了這個數組的所有元素,但將最後一個元素除外(讓數組多一個空間才有插入的位置),而第二部分就只包含這一個元素(即待插入元素)。在第一部分排序完成後,再將這個最後元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步將一個待排序的記錄,按其關鍵碼值的大小插入前面已經排序的文件中適當位置上,直到全部插入完為止。
Ⅶ c語言,用插入排序的方法將五個字元串從小到大排序
#include<stdio.h>
voidmain()
{
inta[]={0,-9,8,1,6};
inti,j,tem;
puts("Arraycontent:");
for(i=0;i<5;i++)
printf("%3d",a[i]);
putchar(10);
for(i=1;i<5;i++)
for(j=0;j<i;j++)
if(a[j]>a[i])
{
tem=a[j];
a[j]=a[i];
a[i]=tem;
}
puts("Sorted:");
for(i=0;i<5;i++)
printf("%3d",a[i]);
printf(" ");
}
Ⅷ C語言 插入排序 向n個有序的數中插入一個x
#include<stdio.h>
intmain()
{intt,n,i,j,x,a[200];
scanf("%d",&t);
for(i=0;i<t;i++)
{scanf("%d%d",&n,&x);
for(j=1;j<=n;j++)
scanf("%d",&a[j]);
a[0]=x;
j=n;
while(a[j]>x)
{a[j+1]=a[j];
j--;
}
a[j+1]=x;
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("%d ",a[i]);
}
return0;
}
Ⅸ C語言插入排序由小到大的代碼
C語言插入排序由小到大的代碼如下:
int main()
{
int a[10];
int i,j,temp=0;
int k,x=0;
printf("輸入10個數: ");
for(i=0;i<10;i++)scanf("%d",&a[i]);
for(i=0;i<9;i++)
{
k = i;
for(j=i+1;j<10;j++)
if(a[j]<a[i])
k = j;
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
printf("排序後: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
getchar();getchar();
}
(9)直接插入排序c語言擴展閱讀:
數學函數
所在函數庫為math.h、stdio.h、string.h、float.h
int abs(int i) 返回整型參數i的絕對值
double cabs(struct complex znum) 返回復數znum的絕對值
double fabs(double x) 返回雙精度參數x的絕對值
long labs(long n) 返回長整型參數n的絕對值
double exp(double x) 返回指數函數ex的值
doublefrexp(double value,int *eptr) 返回value=x*2n中x的值,n存貯在eptr中
doubleldexp(double value,int exp); 返回value*2exp的值
double log(double x) 返回logex的值
double log10(double x) 返回log10x的值
double pow(double x,double y) 返回x^y的值
doublepow10(int p) 返回10^p的值
double sqrt(double x) 返回+√x的值
Ⅹ c語言插入法排序的演算法步驟
演算法描述
一般來說,插入排序都採用in-place在數組上實現。具體演算法描述如下:
從第一個元素開始,該元素可以認為已經被排序
取出下一個元素,在已經排序的元素序列中從後向前掃描
如果該元素(已排序)大於新元素,將該元素移到下一位置
重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
將新元素插入到該位置後
重復步驟2~5
如果比較操作的代價比交換操作大的話,可以採用二分查找法來減少比較操作的數目。該演算法可以認為是插入排序的一個變種,稱為二分查找排序。
范常式式碼
void insertion_sort(int array[], int first, int last)
{
int i,j;
int temp;
for (i = first+1; i<=last;i++)
{
temp = array[i];
j=i-1;
while((j>=first) && (array[j] > temp))
{
array[j+1] = array[j];
j--;
}
array[j+1] = temp;
}
}