排序演算法 7大排序問題解決方法

2021-08-16 19:33:01 字數 2539 閱讀 8000

具有穩定性的排序是:插入排序,歸併排序,氣泡排序

快速排序:是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;

當n較大,

則應採用時間複雜度為

o(nlog2n)

的排序方法:快速排序、堆排序或歸併排序序。

公升序(先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。)

如:假設前n個數是有序的,需要插入第n+1個數,儲存第n+1個數為tmp。然後從第n個數開始tmp比較,如果tmp大,第n+1個數替換成第n個數,依次往前替換,直到那個數小於所儲存的數,那這個位置就插入這個儲存的數

void insertsort(datatype *a,size_t n)//插入排序

a[end+1]=tmp;

}}

1.預排序  2.插入排序

希爾排序我們不在是一步一步的操作元素,採用跳躍式分組的排序。

設定乙個增量gap=length/3+1;若gap=3時則每次遞增3的排序如a[0],a[3],a[6]....進行預排序讓序列盡可能有序。

void xiersort(datatype *a,int n)//希爾排序

a[end+gap]=tmp;

} }}

void swap(datatype *x1,datatype *x2)//交換函式

定義倆個指標,遍歷一遍陣列倆指標乙個從左開始,乙個從右開始。選取最大的元素與最小的元素,放在合適的位置上。

void selectsort(datatype *a,int n)//選擇排序

if (a[i]a[j+1])

}if (flag==0)}}

既然是堆排序,首先要建立堆,如果想排成公升序,則需要調整成大堆,反之為小堆。

建立成大堆後開始排序,取堆頂元素也就是最大的元素放在陣列的最後面,然後重新調整大堆,數量減一。迴圈直到數量大於1.

void adjustdown(datatype *a,size_t n,size_t root)//堆排序用到的向下調整

if (a[parent]=0;i--)

int end=n-1;

while (end>0)

}

挖坑法基本思路:1、尋找div位,然後將其分為兩段陣列,然後對這兩段陣列遞迴排序;2、儲存最右邊的數為key,定義兩個指標begin乙個指向起始位置,end乙個指向最後乙個元素的位置。begin尋找比key大的數字,找到 後將begin的資料賦給end,begin成為乙個坑,然後end尋找key小的數字,找到將end的資料賦給begin,end成為乙個新坑,迴圈這個過程,直到begin指標與end指標相遇,然後將key返回給那個坑,然後進行遞迴操作。

int partsort2(datatype *a,int left,int right)//快速排序  挖坑法 (方法2)

//挖坑法基本思路:1、尋找pos位,然後將其分為兩段陣列,然後對這兩段陣列遞迴排序;2、儲存最右邊的數為key,定義兩個指標begin乙個指向起始位置,end乙個指向最後乙個元素的位置。begin尋找比key大的數字,找到 後將begin的資料賦給end,begin成為乙個坑,然後end尋找key小的數字,找到將end的資料賦給begin,end成為乙個新坑,迴圈這個過程,直到begin指標與end指標相遇,然後將key返回給那個坑,然後進行遞迴操作。

int div=partsort2(a,left,right);

quitsotr(a,left,div-1);

quitsotr(a,div+1,right);

}

定義兩個指標,一前一後,前面指標找比基數小的數,後面指標找比基數大的數,前面的指標找到後,將前後指標所指向的資料交換,當前面的指標遍歷完整個陣列時,將基數值與後指標的後乙個位置的資料進行交換,然後以後指標的後乙個位置作為分界,然後將陣列分開,進行遞迴排序。

int partsort3(datatype *a,int left,int right)//快速排序 前後指標法  (方法3)

int div=partsort3(a,left,right);

quitsotr(a,left,div-1);

quitsotr(a,div+1,right);

}

int partsort(datatype *a,int left,int right)//快速排序,左右指標法( 方法一 )

WPF Image問題解決方法

一.image是控制項,source屬性型別是imagesource 二.imagebrush是筆刷,用於填充 1.基本使用,必須指定imagesource源 imagebrush繼承自tilebrush,imagebrush功能比較強大 三.imagedrawing繼承自drawing,用於繪圖 ...

SeLinux問題解決方法

selinux問題解決方法 3 關於以上修改,google提供的解決方案如下 3.1 如果乙個檔案只是被vendor下的程序使用,可以將此檔案設為vendor data file,存放於 data vendor目錄下 3.2 如果乙個檔案既被system下的程序也被vendor下的程序使用,並且是a...

JSP亂碼問題解決方法

1 在jsp每頁的開頭處寫 page contenttype text html charset gb2312 一定有,而且要在檔案首行 不能在include檔案中 2 讀取資料庫內容時出現的亂碼可以轉換一下 out.println new string rs.getstring 1 getbyte...