陣列排序方法及C實現的總結
1、問題描述
陣列排序(即按某種特定的順序排列資料,如升序或降序)是最重要的計算應用之一,銀行用帳號對所有的支票進行能夠排序,並根據排序結果準備月底的財務報告,學校學生成績管理系統用陣列排序的方法將考試成績從高到低進行排名,陣列排序方法很多,有直接插入排序、氣泡排序、快速排序、直接選擇排序,下面來詳細介紹這四種基本的排序方法及其實現。
2、方法總結
1)直接插入排序:資料表A中每個元素距其最終位置不遠,資料表A按關鍵字值基本有序,可用此方法排序較快。
2)氣泡排序法:將較小的值“上浮”到陣列頂部,而較大值“下沉”到陣列底部,這種排序技術要比較好幾趟,每一趟要比較連續的陣列元素對,如果某對數值是按升序排序的(或者這兩個值相等),那就保持原樣,如果某對陣列是按降序排列的,就要交換它們的值。
3)快速排序法:快速排序是對氣泡排序的一種改進。它的基本思想是:通過一躺排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按次方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
4)直接選擇排序法:直接選擇排序的作法是:第一趟掃描所有資料,選擇其中最小的一個與第一個資料互換;第二趟從第二個資料開始向後掃描,選擇最小的與第二個資料互換;依次進行下去,進行了(n-1)趟掃描以後就完成了整個排序過程。它比起氣泡排序有一個優點就是不用不斷的交換。
3、演算法實現
1)直接插入法實現
#include<stdio.h> #include<conio.h> int main() { void InsertSort(int [],int); int a[7]={8,10,2,3,1,7,13}; int i; InsertSort(a,7); for(i=0;i<7;i++) printf("%4d",a[i]); getch(); } void InsertSort(int a[],int count) { int i,j,temp; for(i=1;i<count;i++) { temp=a[i]; j=i-1; while(a[j]>temp && j>=0) { a[j+1]=a[j]; j--; } if(j!=(i-1)) a[j+1]=temp; } }
2)冒泡法實現
#include<stdio.h> #include<conio.h> int main() { void BubbleSort(int []); int a[10]; int i,j,temp; printf("Input tem integer numbers for a[10]:"); for(i=0;i<10;i++) scanf("%d,",&a[i]); printf("\n"); BubbleSort(a); printf("The sorted array is:\n"); for(j=0;j<10;j++) printf("%d,",a[j]); printf("\n\n"); getch(); } void BubbleSort(int array[]) { int i,j,temp; for(j=0;j<9;j++) for(i=0;i<9-j;i++) if(array[i]>array[i+1]) { temp=array[i]; array[i]=array[i+1]; array[i+1]=temp; } }
3)快速排序法實現
#include<stdio.h>
#include<conio.h>
#define Max 8
int main()
{
void QuickSort(int a[],int p,int r);
int a[]={2,8,7,1,3,5,6,4};
QuickSort(a,1,Max);
printf(" The sorted array is :");
for(int i=0;i<Max;i++)
printf("%d,",a[i]);
printf("\n");
getch();
}
void QuickSort(int a[],int p,int r)
{
int Partition(int a[],int p,int r);
if(p<r)
{
int q=Partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
int Partition(int a[],int p,int r)
{
int i=p-1;
int x=a[r-1];
for(int j=p;j<r;j++)
{
if(a[j-1]<=x)
{
i=i+1;
int temp;
temp=a[j-1];
a[j-1]=a[i-1];
a[i-1]=temp;
}
}
int temp;
temp=a[i];
a[i]=a[r-1];
a[r-1]=temp;
return i+1;
}
4)直接選擇法實現
#include<stdio.h>
#include<conio.h>
int main()
{
void ChooseSort(int []);
int i,j,a[10];
printf("Input ten integer numbers for a[10]: ");
for(i=0;i<10;i++)
scanf("%d,",&a[i]);
printf("\n");
ChooseSort(a);
printf("The sorted array is:\n");
for(j=0;j<10;j++)
printf("%d,",a[j]);
printf("\n\n");
getch();
}
void ChooseSort(int array[])
{
int j,temp,*p1,*p2;
for(p1=array;p1<array+9;p1++)
{
j++;
for(p2=array+j;p2<=array+9;p2++)
if(*p2<*p1)
{
temp=*p2;
*p2=*p1;
*p1=temp;
}
}
}
4、各種方法比較
1)時間效能比較
按平均的時間效能來分,四種類排序方法時間複雜度分別為:
直接插入排序法:O(n^2)
氣泡排序法:O(n^2)
快速排序法:O(nlogn)
直接選擇排序法:O(n^2)
時間複雜度為O(n^2)的有:直接插入排序、起泡排序和簡單選擇排序,其中以直接插入為最好,特別是對那些對關鍵字近似有序的記錄序列尤為如此;當待排記錄序列按關鍵字順序有序時,直接插入排序和起泡排序能達到O(n)的時間複雜度;而對於快速排序而言,這是最不好的情況,此時的時間效能蛻化為O(n2),因此是應該儘量避免的情況。
2)排序方法的穩定效能比較
1.穩定的排序方法指的是,對於兩個關鍵字相等的記錄,它們在序列中的相對位置,在排序之前和經過排序之後,沒有改變。
2.當對多關鍵字的記錄序列進行LSD方法排序時,必須採用穩定的排序方法。
3.對於不穩定的排序方法,只要能舉出一個例項說明即可。
4.快速排序是不穩定的排序方法。