排序演算法有很多種,根據其思想不同,其演算法也不相同。接下來我們研究一下幾種常見的排序演算法。
1. 選擇排序法
選擇排序就是從未排序的資料中選出最小的一個元素,放到數列的最前(或者最後)。排好後,除去第一個元素,對後面的資料再進行選擇排序,依次類推。
程式的實現如下:
#include <stdio.h>
#pragma hdrstop
#include <tchar.h>
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
int i,j,a[10];
int k,m;
printf("Please input 10 digitals:\n");
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[k]>a[j])
k=j;
}
if(k!=i)
{
m=a[i];
a[i]=a[k];
a[k]=m;
}
}
printf("the sorted digitals :\n");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
2. 冒泡排序法:
冒泡排序法就是根據氣泡的上浮下沉來進行數位排序的。思路是將相鄰的兩個數進行比較,小的放前面,大的放後面。先比較第一個數和第二個數,小數放前大數放後,然後比較第二個數和第三個數,小數放前,大數放後…依次類推,直到最後兩個數進行比較,然後再次重複上述步驟,直到排序完成。
程式演算法實現如下:
int _tmain(int argc, _TCHAR* argv[])
{
int i,j,a[10];
int k;
printf("Please input 10 digitals:\n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<9;i++)
{
for(j=0;j<9-i;j++)
{
if(a[j]>a[j+1])
{
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
}
}
}
printf("the sorted digitals :\n");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
3. 插入排序法
插入排序的基本操作就是將一個資料插入到已經排好序的有序資料中,從而得到一個新的個數加1的有序資料。該演算法適用於少量資料的排序。
實現步驟如下:
(1) 從第一個元素開始,該元素可以認為是已經排好序的。
(2) 取出下一個元素,在已排好序的元素數列中從後向前掃描。
(3) 如果該元素(已排好序)大於新元素,該元素移動到下一位。
(4) 重複步驟(3)直到找到已排好序的元素小於或等於新元素的位置。
程式演算法實現如下:
int _tmain(int argc, _TCHAR* argv[])
{
int i,j,a[10];
int k;
printf("Please input 10 digitals:\n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<10;i++)
{
k=a[i];
j=i-1;
while((k<a[j])&&(j>=0))
{
a[j+1]=a[j];
j--;
}
a[j+1]=k;
}
printf("the sorted digitals :\n");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
4. 希爾排序法
希爾排序是插入排序的一種,是針對直接插入排序演算法的改進,該方法也稱為縮小增量排序,因D.L.shell於1959年提出而得名。
首先取一個小於n的整數d1作為第一個增量,把資料的全部元素分為d1個組,同一組中元素的個數是d1的倍數,先在各組內進行直接插入排序,然後取出第二個增量d2<d1,重複上述的分組和排序,直至所取的增量dt=1(dt<dt-1<…<d2<d1),即所有元素放在同一組中進行插入排序為止。
程式演算法實現如下:
#include <stdio.h>
#pragma hdrstop
#include <tchar.h>
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
int i,j,a[10];
int t,k=10;
printf("Please input 10 digitals:\n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
while(k>0)
{
for(i=k;i<10;i++)
{
j=i-k;
while(j>=0)
{
if(a[j]>a[j+k])
{
t=a[j];
a[j]=a[j+k];
a[j+k]=t;
}
else
break;
}
}
k/=2;
}
printf("the sorted digitals :\n");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
希爾排序是基於插入排序的一種演算法,增加了一個新的特性,提高了效率,但不太穩定。對於中等大小規模資料量的排序表現良好。由於希爾排序在最壞的情況下和在平均的情況下執行效率差不多,而快速排序在最壞的情況下執行的效率非常差,所以建議在任何排序工作開始時都可以用希爾排序法進行排序,如果不夠快,再改成快速排序等更進階的排序演算法。
5. 快速排序法
快速排序法是對冒泡排序的一種改進,由C.A.R.Home在1962年提出。其基本思想是通過一趟排序將要排序的資料分割成兩個獨立的部分,其中一部分的所有資料比另外一部分的所有資料都要小,然後再按此方法對著兩部分資料分別進行快速排序。整個排序過程可以通過遞迴實現,已達到整個資料變成有序數列。
程式演算法實現如下:
#include <stdio.h>
#pragma hdrstop
#include <tchar.h>
#pragma argsused
int p(int a[],int low,int high)
{
int key=a[low],p;
while(low<high)
{
while(low<high&&a[high]>=key)
--high;
p=a[low];a[low]=a[high];a[high]=p;
while(low<high&&a[low]<=key)
++low;
p=a[high];a[high]=a[low];a[low]=p;
}
a[low]=key;
return low;
}
void q(int a[],int low,int high)
{
int j;
if(low<high)
{
j=p(a,low,high);
q(a,low,j-1);
q(a,j+1,high);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int i,a[10];
printf("Please input 10 digitals:\n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
q(a,0,9);
printf("the sorted digitals :\n");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}