1. 程式人生 > >linuxC學習第六天

linuxC學習第六天

今天對於一個關於如何查詢1-N-1共N個數據的陣列中重複的資料進行了深入的瞭解和探討
以下是程式程式碼:

一、冒泡排列

#include <stdio.h>
#define SIZE 10

void swap(int a[],int n)
 {
    int i, j, temp;
    
    for (j = 0; j < n - 1; j++)
    {
        for (i = 0; i < n - 1 - j; i++)
        {
            if(a[i] > a[i + 1])
            {
                temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
	    }
	}
    }
}

int main()
{
    int i;
    int number[SIZE]={};  
	
    printf("請輸入要排序的10個數:\n");
	
    for(i=0;i<10;i++)
    {				
        scanf("%d",&number[i]);	
    }
	
    swap(number,SIZE);
	
    for(i=0;i<10;i++)
    {		
        printf("%d\n",number[i]);
	if(number[i] == number[i + 1])
	{
	    printf("重複值=%d\n",number[i+1]);
	}	
    }
	
    return 0;
}

此程式功能是給陣列輸入10個數,然後將陣列的資料重新組合和成從小到大的順序排列並且將其中有重複的值打印出來。冒泡法就是將每一個數據與後面的資料比較,比後面大就替換從而進行排列。缺點:處理資料量大的陣列時時間較長。

二、2個數組來尋找相同的數(用空間代替時間)

#include <stdio.h>

int main()
{	
    int i,c;
    int a[]={1,3,2,6,5,4,9,2,7,9};  
    int b[10]={0};		
	
    for(i=0;i<10;i++)
    {	
        b[a[i]]++;
	while(b[a[i]]==2)
	{
	    printf("%d\n",a[i]);
	    break;
	}
    }
	
	return 0;
}

這個程式是運用2個數組來實現的,第一個陣列存入資料,第二個陣列全為0,根據第一個陣列的資料將此資料對應的第二個陣列的位置加1,判斷第二個陣列中哪一個資料不為1,打印出不為1資料對應的位置就是重複的數。缺點:處理資料量大的陣列時記憶體運用比平常的大。

三、運用替換的方法

#include <stdio.h>

int main()
{	
    int a[10]={2,3,4,1,6,7,8,9,5,9};
    int c,temp=10;
	
    while(a[temp-1] != temp)
    {	
		
	c=a[temp-1];
	a[temp-1]=temp;
	temp=c;	
    }
		
    printf("%d\n",temp);
	
    return 0;
}

同理,用一個數temp(陣列總共位數)與陣列中的數進行比較,不同就替換,然後在以temp的數為陣列的位數再次比較,因為只有一個數是重複的並且是範圍1—N-1,那麼temp中的數將會與陣列的1—N-1位都進行一次比較也就是將陣列按1—N排列了,通俗的說就是陣列的值通過temp與a[temp-1]對換,你會發現temp對應的值就是陣列對應的位置。一旦排列的時候遇到了相同的值在將這個值去找到陣列對應的位置時會發現先前那個位置以及排好了,這樣就能找到重複的值了。缺點:陣列的最後一位資料不能是陣列的長度,不然輸出的值就錯誤了。