一:數組常用排序演算法:
1):冒泡排序(Bubble sorting)
演算法思想: 相鄰2個數比較大小,小者往前移動,一趟比較完後,最小的數冒到最前面,較
大的數(重者)慢慢沉下去,排列到數組的後面.如果有n個數,經過n-1趟比
較,數組中的數便已經排序(升序)的數。
程式碼:
void bubble_sort(int arr[],int size)
{
int temp,flag;
int i,j;
for(int i=0;i<size;i++)
{
flag=0;
for(int j=size-1;j>i;j--)
{
if(arr[j]<arr[j-1])
{
temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
flag=1;
}
}
if(flag==0)break;
}
}
2):交換排序(Swap sorting)
演算法思想:
第1個元素的值與後面的所有元素的值比較大小,如果其中一個值比第1個值
小,進行交換。領獎類推,再將第2個元素與後面的所有元素比較交換,直到
n-1個元素為止。
程式碼:
void swap_sort(int arr[],int size)
{
int temp;
int i,j;
for(i=0;i<size;i++)
for(j=i+1;j<size;j++)
if(arr[j]<arr[i])
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
3):選擇排序(Select sorting)
演算法思想:
交換排序有一個缺點:如果數列後面的資料比前面的資料小,每一趟比較都會
產生多次無謂的交換,浪費系統時間。選擇排序的基本思想是:若有n個數,假
設第1位存放最小的數,將此數與後面的所有數進行比較。用下標變數k來記錄
最小數所在的元素的下標。一趟比較完成後,將arr[0]與arr[k]進行交換。然後設
第2位存放次小的數,依次類推。
程式碼:
void select_sort(int arr[],int size)
{
int i,j,k;
int temp;
for(i=0;i<size;i++)
{
k=i;
for(j=i+1;j<size;j++)
if(arr[j]<arr[k])
k=j;
if(k!=i)
temp=arr[i],arr[i]=arr[k],arr[k]=temp;
}
}
4):直接插入排序(Insert sorting)
演算法思想:
將第1個數視為有序序列,然後依次將後續各數逐個插入到該有序序列中。
程式碼:
void insert_sort(int arr[],int size)
{
int i,j;
int temp;
for(i=1;i<size;i++)
{
temp=arr[i];
for(j=i-1;j>=0;j--)
if(temp<arr[j])
arr[j+1]=arr[j];
else
break;
arr[j+1]=temp;
}
}
二:數組的尋找演算法:
1):順序尋找
演算法思想:
依照數組中元素的順序,依次進行比較,以尋找出元素的位置。
程式碼:
int SequenceSearch(int arr[],int key,int size)
{
int i;
for(i=0;i<size;i++)
if(arr[i]==key)
return i;
return -1;
}
2):折半尋找
演算法思想:這種尋找方法是針對已經排序的數組進行的一個尋找方式,折半尋找極
大的提高了尋找的效能,但是它是以排序數組為代價來換的。
程式碼:
int BinarySearch(int arr[],int key,int size)
{
int low=0,high-size-1,middle;
int count=0;
while(low<=high)
{
middle=(low+high)/2;
count++;
if(key==arr[middle]
{
printf("compare count=%d/n",count);
return middle;
}
else if(key>arr[middle])
low=middle+1;
else
high=middle-1;
}
printf("compare count=%d/n",count);
return -1;
}
NOTE:針對兩個元素的交換位置不藉助中間變數的演算法:
void chang(int x,int y)
{
x=x+y;
y=x-y;
x=x-y;
}