常用排序方法介紹

2021-07-24 20:01:53 字數 2653 閱讀 8899

長沙蒲公英網路

2016-11-17 17:22

長沙**開發時起到事半工倍的效果,今天筆者介紹幾個常用的排序方法。

冒擇路希快歸堆(口訣):氣泡排序,選擇排序,插入排序,希爾排序,快速排序,歸併排序,堆排序;

1、直接插入排序

說明:逐個將後乙個數加到前面的排好的序中。在直接插入排序過程中,對其中乙個記錄的插入排序稱為一次排序;直接插入排序是從第二個記錄開始進行的,因此,長度為n的記錄序列需要進行n-1次排序才能完成整個序列的排序。時間複雜度為o(n2)。

void insertsort(elemtype x,int n)

/*用直接插入法對x[0]-x[n-1]排序*/

int i,j;

elemtype s;

for(i=0;is=x[i+1];

j=i;

while(j>-1&&s.keyx[j+1]=x[j];

j--;

x[j+1]=s;

2、希爾排序

說明:希爾排序又稱縮小增量排序,增量di可以有各種不同的取法,但最後一次排序時的增量必須為1,最簡單可取di+1=di/2(取小)。時間複雜度為o(n(log2n)2)。

void shellsort(elemtype x,int n,int d,int number)

/*用希爾排序法對記錄x[0]-x[n-1]排序,d為增量值陣列*/

/*number為增量值個數,各組內採用直接插入法排序*/

int i,j,k,m,span;

elemtype s;

for(m=0;mspan=d[m];

for(k=0;kfor(i=k;is=x[i+span];

j=i;

while(j>-1&&s.keyx[j+span]=x[j];

j-=span;

x[j+span]=s;

3、直接選擇排序

說明:每次將後面的最小的找出來插入前面的已排好的序中。同理,具有n個記錄的序列要做n-1次排序。

時間複雜度為o(n2)。

void selectsort(elemtype x,int n)

/*用直接選擇排序法對x[0]-x[n-1]排序*/

int i,j,small;

elemtype temp;

for(i=0;ismall=i;

for(j=i+1;jif(x[j].keysmall=j;

if(small!=i)

temp=x[i];

x[i]=x[small];

x[small]=temp;

4、氣泡排序

說明:兩個兩個比較,將大的往後移。通過第一次氣泡排序,使得待排序的n個記錄中關鍵字最大的記錄排到了序列的最後乙個位置上。然後對序列中前n-1個記錄進行第二次氣泡排序。。。對於n個記錄的序列,共需進行n次氣泡排序。時間複雜度為o(n2)。

void bubblesort(elemtype x,int n)

/*用氣泡排序法對x[0]-x[n-1]排序*/

int i,j,flag=1;

elemtype temp;

for(i=1;iflag=0;

for(j=0;jif(x[j].key>x[j+1].key)

flag=1;

temp=x[j];

x[j]=x[j+1];

x[j+1]=temp;

5、快速排序

說明:又叫分割槽交換排序,是對氣泡排序方法的一種改進。時間複雜度為o(nlog2n)。void quicksort(elemtype x,int low,int high)

/*用遞迴方法對記錄x[0]-x[n-1]進行快速排序*/

int i,j;

elemtype temp;

i=low;

j=high;

temp=x[low];

while(i/*在序列的右端掃瞄*/

while(iif(ix[i]=x[j];

i++;

} /*在序列的左端掃瞄*/

while(iif(ix[j]=x[i];

j--;

x[i]=temp; /*對子序列進行快速排序*/

if(lowif(j+16、歸併排序

說明:所謂歸併排序就是將兩個或兩個以上的有序資料序列合併成乙個有序資料序列的過程。

時間複雜度為o(nlog2n)。

void merge(r,l,m,h,r1,r2)/*r[l,m]及r[m+1,h]分別有序,歸併後置於r2中*/

sqlist r,r2;

int l,m,h;

int i,j,k;

k=l;/*k是r2的指示器,i、j分別為s1、s2的指示器*/

i=l;

j=m+1; while(i<=m&&j<=h)

if(r[i].key<=r[j].key)

r2[k]=r[i];

i++;

else

r2[k]=r[j];

j++;

k++;

if(i>m) /*s1結束*/

while(j<=h)

r2[k]=r[j];

j++;k++;

else

while(i<=m)

r2[k]=r[i];

i++;k++;

常用排序演算法介紹

插入排序 將乙個資料插入到已經排好序的有序資料中。演算法適用於少量資料的排序,時間複雜度 為o n 2 是 穩定的排序方法。歸併排序 將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。是一種 穩定的排序方法 若將...

常用canvas方法介紹

getcontext 方法 語法 canvas.getcontext typestr 描述 該方法用於繪製上下文工具.如果是繪製平面圖形使用 2d 作為引數,如果繪製立體圖形使用 webgl 使用 2d 返回canvasrenderingcontext2d型別的物件.使用 webgl 返回webgl...

ArrayUtils的常用方法介紹

1.arrayutils.isempty strs 判斷陣列是否為空 不為空返回false,為空true arrayutils.isempty new string 結果是false arrayutils.isempty new string 結果是false arrayutils.isempty ...