int main ()
創(chuàng)新互聯(lián)專注于梁子湖企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,電子商務(wù)商城網(wǎng)站建設(shè)。梁子湖網(wǎng)站建設(shè)公司,為梁子湖等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
{
int i;
DataType a[MaxSize];
SqList L;
srand((unsigned)time(NULL));
for (i=0;iMaxSize;i++)
{
int number = rand()%MaxSize + 1;
//printf ("%d ",number);
a[i].key = number;
L.data[i].key = a[i].key;
}
return 0;
}
#include stdio.h
#include "4-1 CreateData.c" //生成隨機(jī)數(shù)的函數(shù)
#define ARRAYLEN 10 //需要排序的數(shù)據(jù)元素?cái)?shù)量
void InserSort(int a[],int n)//直接插入排序
{
int i,j,t;
for(i=1;in;i++)
{
t=a[i]; //取出一個(gè)未排序的數(shù)據(jù)
for(j=i-1;j=0 ta[j];--j) //在排序序列中查找位置
a[j+1]=a[j]; //向后移動(dòng)數(shù)據(jù)
a[j+1]=t; //插入數(shù)據(jù)到序列
}
}
int main()
{
int i,a[ARRAYLEN]; //定義數(shù)組
for(i=0;iARRAYLEN;i++) //清空數(shù)組
a[i]=0;
if(!CreateData(a,ARRAYLEN,1,100)) //判斷生成隨機(jī)數(shù)是否成功
{
printf("生成隨機(jī)數(shù)不成功!\n");
getch();
return 1;
}
printf("原數(shù)據(jù):"); //輸出生成的隨機(jī)數(shù)
for(i=0;iARRAYLEN;i++)
printf("%d ",a[i]);
printf("\n");
InserSort(a,ARRAYLEN); //調(diào)用插入排序函數(shù)
printf("排序后:");
for(i=0;iARRAYLEN;i++) //輸出排序后的結(jié)果
printf("%d ",a[i]);
printf("\n");
getch();
return 0;
}
主要是看懂這個(gè)函數(shù) void InserSort(int a[],int n)
for(i=1;i4;i++)
//外層
{
t=a[i];
for(
j=i-1
;
j=0
ta[j]
;
j--
)
//內(nèi)層
a[j+1]=a[j];
a[j+1]=t;
}
你要理解插入排序的原理,外層for從第二個(gè)數(shù)開(kāi)始遍歷(i從1開(kāi)始),用t(即對(duì)應(yīng)的a[i])和其前面的所有值進(jìn)行比較,如果t大,則該數(shù)后移一位,直到t小或者j小于0的時(shí)候退出內(nèi)層for循環(huán),這時(shí)候出現(xiàn)的格局就是所有在i位置之前比a[i]小的值全部后移了一位,退出循環(huán)時(shí)就會(huì)空出一個(gè)位置來(lái)。舉個(gè)例子:輸入:1
3
2
4
第一次循環(huán)時(shí),t=a[1]=3,ta[0],所以a[0]后移一位(即:a[j+1]=a[j]
-
a[1]=a[0]),之后出現(xiàn)結(jié)果:1124,這時(shí)候?qū)嶋H上0位置是給此時(shí)的t預(yù)留的位置,內(nèi)層for執(zhí)行完畢后,執(zhí)行:a[j+1]=t
正好彌補(bǔ)這個(gè)空缺。結(jié)果:3124
第二次循環(huán)時(shí),j=1,t=a[2]=2,ta[1],所以a[1]后移一位:a[2]=a[1],之后結(jié)果:3114,在比較t和a[0],t小,跳出內(nèi)層for,跳出時(shí)j為0,執(zhí)行:a[1]=t=2,結(jié)果:3214
下面就不講了,從上面可以看出,你說(shuō)的那一句,至關(guān)重要,外層for每循環(huán)一次就插入一位數(shù)據(jù),而a[j+1]=t,就是完成插入的最后一步。。
真是搞不懂你們腦洞,一個(gè)插入排序還分成一堆函數(shù)寫(xiě)。。。
#includecstdio
int?a[20];
void?InputArraay(){
for(int?i?=?1;?i?=?10;?i++)scanf("%d",a[i]);
}
void?OutputArraay(){
for(int?i?=?1;?i?=?10;?i++)printf("%d?",a[i]);
}
//插入排序
//1.數(shù)據(jù)分為兩部分,一開(kāi)始有序部分包含1個(gè)元素
//2.依次將無(wú)序部分的元素插入到有序部分當(dāng)中
void?Insert(int?i){
int?j?=?i-1,?k?=?a[i];??//j為當(dāng)前下標(biāo),?k為無(wú)序部分第一個(gè)元素
while(j=1??ka[j]){?//找到k元素在有序部分的位置
a[j+1]?=?a[j];????//循環(huán)的時(shí)候直接右移有序數(shù)組,為k騰出位置
j--;?? ?//不是k正確的位置,繼續(xù)往前循環(huán)
}
a[j+1]?=?k;??//出來(lái)的時(shí)候j多減了1,要加回去
}
void?Sort(){
//遍歷無(wú)序部分,每次取出第一個(gè)元素
for(int?i?=?2;?i?=?10;?i++){?
Insert(i);
}
}
int?main(){
InputArraay();
Sort();
OutputArraay();
return?0;
}
? 通過(guò)C語(yǔ)言實(shí)現(xiàn)插入排序算法:對(duì)于少量排序的元素,插入排序是一個(gè)有效的算法,其操作過(guò)程類(lèi)似于手中的撲克牌,從第二個(gè)元素從左往右循環(huán)檢查比較,滿足A[i]A[i-1],則交換A[i]與A[i-1]的值。往復(fù)循環(huán)直到最后一個(gè)元素比較完成。具體程序如下:
#include stdio.h
#includeconio.h
/*----------
*INSERT_SORT
*
* args
* A[] int[],the number of A arrary
* len int ,A length
*
------------*/
void insert_sort(int A[],int len){
int i,j,key;
//printf("A length %d\n",len);? //output arrary length
for(j=1;jlen;j++){
? ? key=A[j];
? ? i=j-1;
? ? while (i-1A[i]key) {? ? //i from 0 to 5,so i-1
? ? ? ? A[i+1]=A[i];
? ? ? ? i=i-1;
? ? ? ? A[i+1]=key;
? ? }
}
//output A arrary
for(i=0;ilen;i++)
? ? printf("%d ",A[i]);
}
int main()
{
int A[10];
int i=0;
char c;
while(1){
? ? scanf("%d",A[i]); //input unmbers
? ? c=getchar();
? ? if(c=='\n')
? ? ? ? break;
? ? i++;
}
//printf("%d %d %d %d %d %d %d %d\n",A[0],A[1],A[2],A[3],A[4],A[5],A[6],A[7]);
//use insert_sort
insert_sort(A,i+1); //A length is i+1
return 0;
}
/*---test------------
* input 5 2 4 6 1 3
*
* output 1 2 3 4 5 6
* ------------------*/
以上程序使用的是Qt Creator 工具,用C語(yǔ)言實(shí)現(xiàn),經(jīng)調(diào)試已經(jīng)通過(guò)。
但依然有個(gè)問(wèn)題:在main()函數(shù)中調(diào)用insert_sort(int A[])時(shí),若單傳數(shù)組參數(shù)A[],再在insert_sort(int A[])函數(shù)里面調(diào)用len=sizeof(A)/sizeof(int)計(jì)算數(shù)組實(shí)際輸入長(zhǎng)度,但是得不到實(shí)際輸入的數(shù)組長(zhǎng)度,所以只能采用實(shí)參的方式將具體數(shù)字通過(guò)len傳到insert_sort(int A[],int len );在insert_sort(int A[])接收到A數(shù)組后直接計(jì)算A[]實(shí)際輸入長(zhǎng)度,有什么辦法可以實(shí)現(xiàn)?
寫(xiě)個(gè)樣例給你看看吧
#include?stdio.h
int?main()
{
int?n,?a[11],?i,?j,?t,?v;
//scanf("%d",?n);
scanf("%d",?a[0]);//輸入第一個(gè)數(shù)
for?(i?=?1;?i??9;?++i){//剩下的八個(gè)
scanf(",%d",?a[i]);
}
n?=?9;
for?(i?=?0;?i??n;?++i){//選擇排序
t?=?i;
for?(j?=?i?+?1;?j??n;?++j){
if?(a[t]??a[j])t?=?j;
}
if?(t?!=?i){
v?=?a[t],?a[t]?=?a[i],?a[i]?=?v;
}
}
scanf("%d",?v);//要插入的數(shù)
for?(i?=?n-1;?i?=?0;?--i){
if?(a[i]??v){
a[i?+?1]?=?a[i];
}
else?break;
}
++i;//插入位置
a[i]?=?v;
n++;
for?(i?=?0;?i??n;?++i){//輸出
if?(i?==?0)printf("%d",?a[i]);
else?printf(",%d",?a[i]);
}
printf("\n");
return?0;
}