導航:首頁 > 使用方法 > 常用排序方法

常用排序方法

發布時間:2022-02-07 19:35:07

Ⅰ C語言中最常用的排序方法有哪些

選擇排序法,冒泡排序法等,書上關於冒泡法有個例子。

Ⅱ 幾種常用的排序演算法比較

排序,從小大,0坐標的在下面,即排序後小的在下面,大的在上面。

1,冒泡Bubble:從第0個開始,一直往上,與相鄰的元素比較,如果下面的大,則交換。
Analysis:
Implementation:
void BubbleSort(int *pData, int iNum)

2,插入Insertion:與打撲克牌時整理牌很想像,假定第一張牌是有序的,從第二張牌開始,拿出這張牌來,往下比較,如果有比這張牌大的,則把它撥到上一個位置,直到找到比手上的這張更小的(或到頂了),
則把手上的這張牌插入到這張更小的牌的後面。
Analysis:
Implementation:
void InsertionSort(int *list, int length)
{
int i, j, temp;
for (i = 1; i < length; i++)
{
temp = list[i];
j = i - 1;
while ((j >= 0) && (list[j] > temp))
{
list[j+1] = list[j];
j--;
}
list[j+1] = temp;
}
}

3,選擇Selection:從所有元素中找到最小的放在0號位置,從其它元素(除了0號元素)中再找到最小的,放到1號位置,......。
Analysis:
Implementation:
void SelectionSort(int data[], int count)
{
int i, j, min, temp;
for (i = 0; i < count - 1; i++)
{
/* find the minimum */
min = i;
for (j = i+1; j < count; j++)
{
if (data[j] < data[min])
{
min = j;
}
}
/* swap data[i] and data[min] */
temp = data[i];
data[i] = data[min];
data[min] = temp;
}
}

4,快速Quick:先拿出中間的元素來(值保存到temp里),設置兩個索引(index or pointer),一個從0號位置開始往最大位置尋找比temp大的元素;一個從最大號位置開始往最小位置尋找比temp小的元素,找到了或到頂了,則將兩個索引所指向的元素
互換,如此一直尋找交換下去,直到兩個索引交叉了位置,這個時候,從0號位置到第二個索引的所有元素就都比temp小,從第一個索引到最大位置的所有元素就都比temp大,這樣就把所有元素分為了兩塊,然後採用前面的辦法分別排序這兩個部分。總的來
說,就是隨機找一個元素(通常是中間的元素),然後把小的放在它的左邊,大的放右邊,對左右兩邊的數據繼續採用同樣的辦法。只是為了節省空間,上面採用了左右交換的方法來達到目的。
Analysis:
Implementation:
void QuickSort(int *pData, int left, int right)
{
int i, j;
int middle, iTemp;
i = left;
j = right;

middle = pData[(left + right) / 2]; //求中間值
do
{
while ((pData[i] < middle) && (i < right)) //從左掃描大於中值的數
i++;

while ((pData[j] > middle) && (j > left)) //從右掃描小於中值的數
j--;

if (i <= j) //找到了一對值
{
//交換
iTemp = pData[i];
pData[i] = pData[j];
pData[j] = iTemp;
i++;
j--;
}
} while (i <= j); //如果兩邊掃描的下標交錯,就停止(完成一次)

//當左邊部分有值(left<j),遞歸左半邊
if(left < j)
QuickSort(pData, left, j);

//當右邊部分有值(right>i),遞歸右半邊
if(right > i)
QuickSort(pData, i, right);
}

5,希爾Shell:是對Insertion Sort的一種改進,在Insertion Sort中,從第2個位置開始取出數據,每次都是與前一個(step/gap==1)進行比較。Shell Sort修改為,在開始時採用較大的步長step,
從第step位置開始取數據,每次都與它的前step個位置上的數據進行比較(如果有8個數據,初始step==4,那麼pos(4)與pos(0)比較,pos(0)與pos(-4),pos(5)與pos(1),pos(1)與pos(-3),
...... pos(7)與pos(3),pos(3)與pos(-1)),然後逐漸地減小step,直到step==1。step==1時,排序過程與Insertion Sort一樣,但因為有前面的排序,這次排序將減少比較和交換的次數。
Shell Sort的時間復雜度與步長step的選擇有很大的關系。Shell排序比冒泡排序快5倍,比插入排序大致快2倍。Shell排序比起QuickSort,MergeSort,HeapSort慢很多。但是它相對比較簡單,它適合
於數據量在5000以下並且速度並不是特別重要的場合。它對於數據量較小的數列重復排序是非常好的。
Analysis:
Implementation:
template<typename RandomIter, typename Compare>
void ShellSort(RandomIter begin, RandomIter end, Compare cmp)
{
typedef typename std::iterator_traits<RandomIter>::value_type value_type;
typedef typename std::iterator_traits<RandomIter>::difference_type diff_t;

diff_t size = std::distance(begin, end);
diff_t step = size / 2;
while (step >= 1)
{

for (diff_t i = step; i < size; ++i)
{
value_type key = *(begin+i);
diff_t ins = i; // current position

while (ins >= step && cmp(key, *(begin+ins-step)))
{
*(begin+ins) = *(begin+ins-step);
ins -= step;
}

*(begin+ins) = key;
}

if(step == 2)
step = 1;
else
step = static_cast<diff_t>(step / 2.2);
}
}

template<typename RandomIter>
void ShellSort(RandomIter begin, RandomIter end)
{
typedef typename std::iterator_traits<RandomIter>::value_type value_type;
ShellSort(begin, end, std::less<value_type>());
}

6,歸並Merge:先將所有數據分割成單個的元素,這個時候單個元素都是有序的,然後前後相鄰的兩個兩兩有序地合並,合並後的這兩個數據再與後面的兩個合並後的數據再次合並,充分前面的過程直到所有的數據都合並到一塊。
通常在合並的時候需要分配新的內存。
Analysis:
Implementation:
void Merge(int array[], int low, int mid, int high)
{
int k;
int *temp = (int *) malloc((high-low+1) * sizeof(int)); //申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合並後的序列
int begin1 = low;
int end1 = mid;
int begin2 = mid + 1;
int end2 = high;

for (k = 0; begin1 <= end1 && begin2 <= end2; ++k) //比較兩個指針所指向的元素,選擇相對小的元素放入到合並空間,並移動指針到下一位置
{
if(array[begin1]<=array[begin2])
{
temp[k] = array[begin1++];
}
else
{
temp[k] = array[begin2++];
}
}
if(begin1 <= end1) //若第一個序列有剩餘,直接拷貝出來粘到合並序列尾
{
memcpy(temp+k, array+begin1, (end1-begin1+1)*sizeof(int));
}
if(begin2 <= end2) //若第二個序列有剩餘,直接拷貝出來粘到合並序列尾
{
memcpy(temp+k, array+begin2, (end2-begin2+1)*sizeof(int));
}
memcpy(array+low, temp, (high-low+1)*sizeof(int));//將排序好的序列拷貝回數組中
free(temp);
}

void MergeSort(int array[], unsigned int first, unsigned int last)
{
int mid = 0;
if (first < last)
{
mid = (first+last)/2;
MergeSort(array, first, mid);
MergeSort(array, mid+1,last);
Merge(array,first,mid,last);
}
}

Ⅲ Excel表格中常用的排序方法有哪些

製作Excel表格的過程中,對其中的內容進行排序是大家經常會遇到的情況,下面小編介紹幾種最為常用但是很多人卻不知道的排序方法。
01
首先就是按照筆劃來排序,我們經常會看到課本或者花名冊上都有按照姓氏筆畫來排序的提示,也就是說按照筆劃的多少進行排列的,如何設置這種排序呢?首先我們選中需要排序的那一列,比如下圖中的B列;
02
然後依次點擊工具欄中的「數據」-「排序」,如圖一所示...然後在彈出的排序提醒對話框勾選下方的「以當前選定區域排序」;
03
接下來點擊排序對話框右上角的「選項」,然後勾選排序選項對話框最下方的「筆劃排序」;
04
點擊確定返回到表格以後,我們就會發現這一列的所有文字全部按照首個文字的筆劃多少來進行排序了;此外如果有時候不知道應該按照何種規則來排序的話,那麼就可以用到下面小編介紹的隨機排序方法了,在表格的最後一列輸入公式「=RAND()」,見圖二...
05
點擊回車鍵以後,該單元格中就會彈出一個隨機數字,將其下拉拖動應用到所有列,最終效果如圖一所示...然後依次點擊「數據」-「升序」或者「降序」,這樣表格裡面的內容就會隨機排序了;
06
最後我們還能按照表格中文字的顏色來排序,比如下圖的表格中既有紅色文字,也有藍色文字...
07
依舊按照以上的方法將排序對話框打開,然後勾選排序依舊中的「字體顏色」,並且自定義每種顏色文字的次序,我們以紅色文字在頂端,藍色文字在底端為例做介紹;
08
同樣點擊對話框中的確定,返回到表格以後,我們就會發現紅色的文字內容在表格最頂端,而藍色的文字則被排序到了最底端,如下圖所示...

Ⅳ JAVA中有哪幾種常用的排序方法每個排序方法的實現思路是如何的每個方法的思想是什麼

一、冒泡排序

已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先比較 a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[2]與a[3]的值,若a[2]大於a[3]則交換兩者的值,否則不變。再比較a[3]與a[4],以此類推,最後比較a[n-1]與a[n]的值。這樣處理一輪後,a[n]的值一定是這組數據中最大的。再對 a[1]~a[n-1]以相同方法處理一輪,則a[n-1]的值一定是a[1]~a[n-1]中最大的。再對a[1]~a[n-2]以相同方法處理一輪,以此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。

優點:穩定;

缺點:慢,每次只能移動相鄰兩個數據。

二、選擇排序

冒泡排序的改進版。

每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最後,直到全部待排序的數據元素排完。

選擇排序是不穩定的排序方法。

n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:

①初始狀態:無序區為R[1..n],有序區為空。

②第1趟排序

在無序區R[1..n]中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1]交換,使R[1..1]和R[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

……

③第i趟排序

第i趟排序開始時,當前有序區和無序區分別為R[1..i-1]和R(1≤i≤n- 1)。該趟排序從當前無序區中選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

這樣,n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。

優點:移動數據的次數已知(n-1次);

缺點:比較次數多。

三、插入排序

已知一組升序排列數據a[1]、a[2]、……a[n],一組無序數據b[1]、 b[2]、……b[m],需將二者合並成一個升序數列。首先比較b[1]與a[1]的值,若b[1]大於a[1],則跳過,比較b[1]與a[2]的值,若b[1]仍然大於a[2],則繼續跳過,直到b[1]小於a數組中某一數據a[x],則將a[x]~a[n]分別向後移動一位,將b[1]插入到原來 a[x]的位置這就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若無數組a,可將b[1]當作n=1的數組a)

優點:穩定,快;

缺點:比較次數不一定,比較次數越少,插入點後的數據移動越多,特別是當數據總量龐大的時候,但用鏈表可以解決這個問題。

三、縮小增量排序

由希爾在1959年提出,又稱希爾排序(shell排序)。

已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。發現當n不大時,插入排序的效果很好。首先取一增量d(d<n),將a[1]、a[1+d]、a[1+2d]……列為第一組,a[2]、a[2+d]、 a[2+2d]……列為第二組……,a[d]、a[2d]、a[3d]……列為最後一組以次類推,在各組內用插入排序,然後取d'<d,重復上述操作,直到d=1。

優點:快,數據移動少;

缺點:不穩定,d的取值是多少,應取多少個不同的值,都無法確切知道,只能憑經驗來取。

四、快速排序

快速排序是目前已知的最快的排序方法。

已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先任取數據 a[x]作為基準。比較a[x]與其它數據並排序,使a[x]排在數據的第k位,並且使a[1]~a[k-1]中的每一個數據<a[x],a[k+1]~a[n]中的每一個數據>a[x],然後採用分治的策略分別對a[1]~a[k-1]和a[k+1]~a[n] 兩組數據進行快速排序。

優點:極快,數據移動少;

缺點:不穩定。

五、箱排序

已知一組無序正整數數據a[1]、a[2]、……a[n],需將其按升序排列。首先定義一個數組x[m],且m>=a[1]、a[2]、……a[n],接著循環n次,每次x[a]++.

優點:快,效率達到O(1)

缺點:數據范圍必須為正整數並且比較小

六、歸並排序

歸並排序是多次將兩個或兩個以上的有序表合並成一個新的有序表。最簡單的歸並是直接將兩個有序的子表合並成一個有序的表。

歸並排序是穩定的排序.即相等的元素的順序不會改變.如輸入記錄 1(1) 3(2) 2(3) 2(4) 5(5) (括弧中是記錄的關鍵字)時輸出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按輸入的順序.這對要排序數據包含多個信息而要按其中的某一個信息排序,要求其它信息盡量按輸入的順序排列時很重要.這也是它比快速排序優勢的地方.

Ⅳ 幾種排序方法

這兩天復習了一下排序方面的知識,現將目前比較常見的整理一下。 選擇排序選擇排序的思想是首先先找到序列中最大元素並將它與序列中最後一個元素交換,然後找下一個最大元素並與倒數第二個元素交換,依次類推。此排序很簡單,這不做多說,代碼實現如下:View Code插入排序演算法流程:1. 從第一個元素開始,該元素可以認為已經被排序 2. 取出下一個元素,在已經排序的元素序列中從後向前掃描 3. 如果該元素(已排序)大於新元素,將該元素移到下一位置 4. 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置 5. 將新元素插入到下一位置中 6. 重復步驟2View Code冒泡排序依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。在第二趟:仍從第一對數開始比較(因為可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數)。如此下去,重復以上過程,直至最終完成排序。 View Code合並排序在介紹合並排序之前,首先介紹下遞歸設計的技術,稱為分治法。分治法的核心思想是:當問題比較小時,直接解決。當問題比較大時,將問題分為兩個較小的子問題,每個子問題約為原來的一半。使用遞歸調用解決每個子問題。遞歸調用結束後,常常需要額外的處理,將較小的問題的結果合並,得到較大的問題的答案。 合並排序演算法在接近數組中間的位置劃分數組,然後使用遞歸運算對兩個一半元素構成的數組進行排序,最後將兩個子數組進行合並,形成一個新的已排好序的數組。 代碼如下:View Code快速排序快速排序與合並排序有著很多相似性。將要排序的數組分成兩個子數組,通過兩次遞歸調用分別對兩個數組進行排序,再將已經排好序的兩個數組合並成一個獨立的有序數組。但是,將數組一分為二的做法比合並排序中使用的簡單方法復雜的多。它需要將所有小於或者等於基準元素的元素放置到基準元素前面的位置,將大於基準的元素放置到基準後面的位置。 View Code堆排序View Code大概常用的幾種排序就這幾種,希望大家多多指正。

Ⅵ JAVA中有哪幾種常用的排序方法

1、冒泡排序
冒泡排序是一個比較簡單的排序方法。在待排序的數列基本有序的情況下排序速度較快。若要排序的數有n個,則需要n-1輪排序,第j輪排序中,從第一個數開始,相鄰兩數比較,若不符合所要求的順序,則交換兩者的位置;直到第n+1-j個數為止,第一個數與第二個數比較,第二個數與第三個數比較,......,第n-j個與第n+1-j個比較,共比較n-1次。此時第n+1-j個位置上的數已經按要求排好,所以不參加以後的比較和交換操作。例如:第一輪排序:第一個數與第二個數進行比較,若不符合要求的順序,則交換兩者的位置,否則繼續進行二個數與第三個數比較......。直到完成第n-1個數與第n個數的比較。此時第n個位置上的數已經按要求排好,它不參與以後的比較和交換操作;第二輪排序:第一個數與第二個數進行比較,......直到完成第n-2個數與第n-1個數的比較;......第n-1輪排序:第一個數與第二個數進行比較,若符合所要求的順序,則結束冒泡法排序;若不符合要求的順序,則交換兩者的位置,然後結束冒泡法排序。
共n-1輪排序處理,第j輪進行n-j次比較和至多n-j次交換。
從以上排序過程可以看出,較大的數像氣泡一樣向上冒,而較小的數往下沉,故稱冒泡法。

2、選擇排序
選擇法的原理是先將第一個數與後面的每一個數依次比較,不斷將將小的賦給第一個數,從而找出最小的,然後第二個數與後面的每一個數依次比較,從而找出第二小的,然後第三個數與後面的

3、插入排序
插入排序的原理是對數組中的第i個元素,認為它前面的i-1個已經排序好,然後將它插入到前面的i-1個元素中。插入排序對少量元素的排序較為有效.

4、快速排序
快速排序是對冒泡排序的一種改進。它的基本思想是:通過一次排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按次方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此大道整個數據變成有序序列。

Ⅶ 重溫數據結構寫的幾種常用排序方法,給新手參考

#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <malloc.h> #include <memory.h> #include <time.h>void print(int a[], int n) { int i =1; while(i<=n) { printf("%d,", a[i]); i++; } printf("\n"); return; } //直接插入排序,時間復雜度O(n^2),空間復雜度O(1),穩定排序 //a[0]不參與排序,實際排序空間為a[1]~a[n]void InsertSort(int a[], int n) { for(int i=2; i<=n; i++) { if(a[i]<a[i-1]) { a[0] = a[i]; int j = i -1; //掃描有序空間,while(a[0]<a[j]) { a[j+1] = a[j]; j--; } a[j+1] = a[0]; } } printf("InsertSort : "); print(a, n); return; } //一次Shell排序過程void ShellPass(int a[], int n, int increment) { for(int i=increment+1; i<=n; i++) { if(a[i]<a[i-increment]) { a[0] = a[i]; int j=i-increment; while(j>0&& a[0]<a[j]) { a[j+increment] = a[j]; j -= increment; } a[j+increment] = a[0]; } } return; } //Shell排序,時間復雜度依賴於增量序列,應避免互為倍數的增量序列, //目前較好時間復雜度為n^1.25~1.6n^1.25,空間復雜度為O(1),不穩定排序void ShellSort(int a[], int n) { int increment =20; do { increment = increment/3+1; ShellPass(a, n, increment); }while(increment>1); printf("ShellSort : "); print(a, n); return; } //冒泡排序,時間復雜度O(n^2),空間復雜度O(1),穩定排序void BubbleSort(int a[], int n) { for(int i=1; i<n; ) { int lastExchangePos = n;//記錄一次排序中最後一次交換的位置,此位置之前的所有數據都已有序for(int j=n-1; j>=i; j--) { if(a[j+1]<a[j]) { a[0] = a[j+1]; a[j+1] = a[j]; a[j] = a[0]; lastExchangePos = j+1; } } i = lastExchangePos; } printf("BubbleSort : "); print(a, n); return; } ////快速排序,平均時間復雜度為O(nlgn),空間復雜度為O(lgn)~O(n),快速排序不穩定。//C++中快速排序的實現,void QuickSort(int a[], int low, int high) { srand(time(0)); a[0] = a[rand()%(high-low+1)+low];//隨機選擇基準,改善快排的性能int tmp =0; int i = low, j = high; while(i<=j) { while(i<high && a[i]<a[0]) i++; while(j>low && a[j]>a[0]) j--; if(i<=j) { tmp = a[i]; a[i] = a[j]; a[j] = tmp; i++; j--; } } if(j>low) QuickSort(a, low, j); if(i<high) QuickSort(a, i, high); return; } //快速排序的一次劃分int Partition(int a[], int low, int high) { srand(time(0)); int pos = rand()%(high-low+1)+low; a[0] = a[pos]; a[pos] = a[low]; while(low<high) { while(low<high && a[0]<a[high]) high--; if(low<high) a[low++] = a[high]; while(low<high && a[0]>a[low]) low++; if(low<high) a[high--] = a[low]; } a[low] = a[0]; return low; } //數據結構中標準的快速排序演算法void QSort(int a[], int low, int high) { if(low<high) { int p = Partition(a, low, high); QSort(a, low, p-1); QSort(a, p+1, high); } return; } //直接選擇排序,時間復雜度為O(n^2),空間復雜度為O(1),不穩定排序void SelectSort(int a[], int n) { for(int i=1; i<=n; i++) { int min = i; for(int j=i+1; j<=n; j++) { if(a[j]<a[min]) min = j; } if(min!=i) { a[0] = a[i]; a[i] = a[min]; a[min] = a[0]; } } printf("SelectSort : "); print(a, n); return; } //調整堆void Heapify(int a[], int s, int to) { /* //Heapify方法的遞歸演算法 a[0] = a[s]; int tmp = 2*s; if(tmp+1<=to && a[tmp]<a[tmp+1])tmp++; if(tmp<=to && a[0]<a[tmp]) { a[s] = a[tmp]; a[tmp] = a[0]; Heapify(a, tmp, to); }*///Heapify方法的遞推演算法 a[0] = a[s]; for(int j=2*s; j<=to; j*=2) { if(j+1<=to && a[j]<a[j+1])j++; if(j<=to && a[0]>=a[j]) break; a[s] = a[j]; // a[j] = a[0]; s = j; } a[s] = a[0]; return; } //堆排序,最壞時間復雜度nlgn,空間復雜度為O(1),不穩定排序,適合大量數據的排序void HeapSort(int a[], int n) { for(int j=n/2; j>0; j--) Heapify(a, j, n); for(int j=n; j>1; j--) { a[0] = a[j]; a[j] = a[1]; a[1] = a[0]; Heapify(a, 1, j-1); } printf("HeapSort : "); print(a, n); return; } //歸並排序的一次合並過程void MergePass(int a[], int low, int mid, int high) { int*p = (int*)malloc(sizeof(int)*(high-low+1)); assert(p!=NULL); int*pi = p; int i = low, j = mid+1; while(i<=mid && j<=high) *(pi++) = (a[i]<=a[j])? a[i++] : a[j++]; while(i<=mid) *(pi++) = a[i++]; while(j<=high) *(pi++) = a[j++]; pi = p; while(low<=high) a[low++] =*(pi++); free(p); return; } //歸並排序,時間復雜度O(nlgn),空間復雜度O(n),穩定排序void MergeSort(int a[], int low, int high) { if(low<high) { int mid = (low+high)/2; MergeSort(a, low, mid); MergeSort(a, mid+1, high); MergePass(a, low, mid, high); } return; } int main() { //source[0]不參與排序,做為輔助空間使用int source[] = {0, 10, 8, 30, 55, 6, 0, 99, 87, -5, 32, 66, 54, 33, 21, 32, 96, 121, 70}; int n =sizeof(source)/sizeof(source[0])-1; int a[sizeof(source)/sizeof(source[0])]; memcpy(a, source, sizeof(source)); InsertSort(a, n); memcpy(a, source, sizeof(source)); ShellSort(a, n); memcpy(a, source, sizeof(source)); BubbleSort(a, n); memcpy(a, source, sizeof(source)); QuickSort(a, 1, n); printf("QuickSort : "); print(a, n); memcpy(a, source, sizeof(source)); QSort(a, 1, n); printf("QSort : "); print(a, n); memcpy(a, source, sizeof(source)); SelectSort(a, n); memcpy(a, source, sizeof(source)); HeapSort(a, n); memcpy(a, source, sizeof(source)); MergeSort(a, 1, n); printf("MergeSort : "); print(a, n); return0; }

Ⅷ Excel表常用排序技巧

按圖示操作:

假設 需要看A列再看B,C,D

那操作就是先點D列任一單元格,點擊a->z,(ak Z->A),再選中C列任一單元格,點擊a->Z....類推直至A列,這是其中一種方法


Ⅸ 常用排序方法的應用

排序簡介
排序是數據處理中經常使用的一種重要運算,在計算機及其應用系統中,花費在排序上的時間在系統運行時間中佔有很大比重;並且排序本身對推動演算法分析的發展也起很大作用。目前已有上百種排序方法,但尚未有一個最理想的盡如人意的方法,本章介紹常用的如下排序方法,並對它們進行分析和比較。
1、插入排序(直接插入排序、折半插入排序、希爾排序);
2、交換排序(起泡排序、快速排序);
3、選擇排序(直接選擇排序、堆排序);
4、歸並排序;
5、基數排序;
學習重點
1、掌握排序的基本概念和各種排序方法的特點,並能加以靈活應用;
2、掌握插入排序(直接插入排序、折半插入排序、希爾排序)、交換排序(起泡排序、快速排序)、選擇排序(直接選擇排序、堆排序)、二路歸並排序的方法及其性能分析方法
3、了解基數排序方法及其性能分析方法。
排序(sort)或分類
所謂排序,就是要整理文件中的記錄,使之按關鍵字遞增(或遞減)次序排列起來。其確切定義如下:
輸入:n個記錄R1,R2,…,Rn,其相應的關鍵字分別為K1,K2,…,Kn。
輸出:Ril,Ri2,…,Rin,使得Ki1≤Ki2≤…≤Kin。(或Ki1≥Ki2≥…≥Kin)。
1.被排序對象--文件
被排序的對象--文件由一組記錄組成。
記錄則由若干個數據項(或域)組成。其中有一項可用來標識一個記錄,稱為關鍵字項。該數據項的值稱為關鍵字(Key)。
注意:
在不易產生混淆時,將關鍵字項簡稱為關鍵字。
2.排序運算的依據--關鍵字
用來作排序運算依據的關鍵字,可以是數字類型,也可以是字元類型。
關鍵字的選取應根據問題的要求而定。
【例】在高考成績統計中將每個考生作為一個記錄。每條記錄包含准考證號、姓名、各科的分數和總分數等項內容。若要惟一地標識一個考生的記錄,則必須用"准考證號"作為關鍵字。若要按照考生的總分數排名次,則需用"總分數"作為關鍵字。
排序的穩定性
當待排序記錄的關鍵字均不相同時,排序結果是惟一的,否則排序結果不唯一。
在待排序的文件中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的;若具有相同關鍵字的記錄之間的相對次序發生變化,則稱這種排序方法是不穩定的。
注意:
排序演算法的穩定性是針對所有輸入實例而言的。即在所有可能的輸入實例中,只要有一個實例使得演算法不滿足穩定性要求,則該排序演算法就是不穩定的。
排序方法的分類
1.按是否涉及數據的內、外存交換分
在排序過程中,若整個文件都是放在內存中處理,排序時不涉及數據的內、外存交換,則稱之為內部排序(簡稱內排序);反之,若排序過程中要進行數據的內、外存交換,則稱之為外部排序。
注意:
① 內排序適用於記錄個數不很多的小文件
② 外排序則適用於記錄個數太多,不能一次將其全部記錄放人內存的大文件。
2.按策略劃分內部排序方法
可以分為五類:插入排序、選擇排序、交換排序、歸並排序和分配排序。
排序演算法分析
1.排序演算法的基本操作
大多數排序演算法都有兩個基本的操作:
(1) 比較兩個關鍵字的大小;
(2) 改變指向記錄的指針或移動記錄本身。
注意:
第(2)種基本操作的實現依賴於待排序記錄的存儲方式。
2.待排文件的常用存儲方式
(1) 以順序表(或直接用向量)作為存儲結構
排序過程:對記錄本身進行物理重排(即通過關鍵字之間的比較判定,將記錄移到合適的位置)
(2) 以鏈表作為存儲結構
排序過程:無須移動記錄,僅需修改指針。通常將這類排序稱為鏈表(或鏈式)排序;
(3) 用順序的方式存儲待排序的記錄,但同時建立一個輔助表(如包括關鍵字和指向記錄位置的指針組成的索引表)
排序過程:只需對輔助表的表目進行物理重排(即只移動輔助表的表目,而不移動記錄本身)。適用於難於在鏈表上實現,仍需避免排序過程中移動記錄的排序方法。
3.排序演算法性能評價
(1) 評價排序演算法好壞的標准
評價排序演算法好壞的標准主要有兩條:
① 執行時間和所需的輔助空間
② 演算法本身的復雜程度
(2) 排序演算法的空間復雜度
若排序演算法所需的輔助空間並不依賴於問題的規模n,即輔助空間是O(1),則稱之為就地排序(In-PlaceSou)。
非就地排序一般要求的輔助空間為O(n)。
(3) 排序演算法的時間開銷
大多數排序演算法的時間開銷主要是關鍵字之間的比較和記錄的移動。有的排序演算法其執行時間不僅依賴於問題的規模,還取決於輸入實例中數據的狀態。

Ⅹ 數據結構中常見的排序方式都有哪些比如冒泡排序,快速排序等。每種排序具體是怎麼排的

1.直接插入:就是有一個已經排好的子序列,它是有序的。然後來一個插入一個仍是這個序列有序。比如a1本身就是有序的。a2來了,要和a1比較,a2大就插在a1之後,小就在a1之前,那麼a1、a2就是新的有序子序列,然後a3來了,又要插入進來,逐個與a2、a1比較插在它的適當位置再次形成子序列,就按這樣一步步進行,知道最後一個插入時,以前的都已經有序了。
2.希爾排序:由於有時候數據量大,用直接插入就不太合適。於是把你的一組待排序數據按如8、4、2、1的一組增量數來分組,即第一次,a1和a9和a17甚至還有更多間隔為八的數分為一組進行直接插入排序,第二次則是新的a1和a5、a9、a13……依次知道最後比較數據之間的間隔數為1,每次都進行插入排序
3.直接選擇:n個數逐個比較,誰大的誰放最後(n的位置),比較范圍減一;然後又從n-1個數中找最大的,又放最後(n-1的位置),依次這樣進行就可以。
4.冒泡:比較的時候如果前者比後者大就要進行值的交換。那麼最大的每次都會沉到底下。比較范圍減一。
5、快速排序:要採用分劃控制。比較復雜。

閱讀全文

與常用排序方法相關的資料

熱點內容
聽笛子最簡單的方法 瀏覽:584
5除以29的豎式計算方法 瀏覽:854
水瓜絲的功效與作用及食用方法 瀏覽:353
小學生畫棉花書簽的簡單方法 瀏覽:262
如何抓斑鳩方法視頻 瀏覽:224
鍋外層掉漆了怎麼處理方法 瀏覽:808
秒熱水器安裝方法視頻秒 瀏覽:325
次級天然石材鑒別方法 瀏覽:972
雞翅木傢具的鑒別方法 瀏覽:799
鈴蘭花葉片連接方法 瀏覽:963
如何快去減肥的方法 瀏覽:166
周口拉布拉多訓練方法 瀏覽:331
自我隔離解決方法 瀏覽:442
庭院燈底座安裝方法 瀏覽:191
開鎖方法視頻 瀏覽:566
全身美白最有效方法快速 瀏覽:235
疊手機盒子的方法視頻 瀏覽:810
術後腸粘連的治療方法 瀏覽:912
限號字母計算方法 瀏覽:593
摔跤徒手訓練方法 瀏覽:533