每次需要排序的時候總是會忘記基本的排序演算法,為了防止自己再次忘記,寫個部落格加深自己的印象:
簡單選擇排序大概就是最簡單我們最容易想到的一種排序方法,一共進行n-1次選擇,在第i次選擇中選擇第i小的數放在相應的位置。我們可以想象一種場景,有一些賬單需要我們按照時間進行排序,我媽每次選擇最早的一張拿在手上,再從剩下的賬單裡選擇最早的放在手中賬單的底下。
static
class selectsort
}if(min!=i)}}
}
每次選擇出乙個第i小的數放在正確的位置會發生交換,導致元素位置改變,所以是不穩定的。
插入排序我們可以想象我們在玩撲克牌,每次從牌堆中拿一張,根據牌面的大小插入手中的牌。
static
class insertionsort
array[i+1]=key;}}
}
快速排序的重點就在劃分,我們選擇乙個標準元素,然後讓它左邊的元素都小於它,右邊的元素都大於它。接著進行遞迴處理它左邊的所有元素和右邊的所有元素。
static
class quicksort
}static
int partition(int array,int p,int q)
}exchange(array,++i,q);//交換元素i+1和q
return i;
}}
在劃分的過程中存在交換,因此會打亂相同元素相對順序。
每次比較相鄰的元素,如果左邊的元素比右邊的元素大,那麼就會交換位置,所以每一輪排序都會把最大的數放在正確的位置。
static
class bubblesort}}
}}
開始將陣列分為長度為1的n個有序表,然後逐步合併。
static
class mergesort}}
static
void merge_pass(int array,int array1,int h)
if(i}
}static
void merge(int array,int array1,int a,int b,int c)else
}while(i<=b)array1[k++]=array[i++];
while(j<=c)array1[k++]=array[j++];
}}
對直接插入排序的一種改進,因為基本有序的序列,直接插入最快,記錄數很少的無序序列插入也很快。將待排序的記錄集分成多個子集,分別對這些子集進行插入排序。
static
class shellsort
array[j+d]=key;}}
}}
}
演算法名稱
穩定性演算法複雜度
簡單選擇排序
不穩定o(n^2)
插入排序
穩定最壞情況下o(n^2)
快速排序
不穩定平均情況o(n*log2(n)),最壞情況o(n^2)
希爾排序
不穩定o(n*log2(n))到o(n^2)
氣泡排序
穩定最壞情況o(n^2)
歸併排序
穩定o(n*log2(n))
穩定性是指在排序完成之後相同值的元素的相對位置不會改變*
內排序演算法比較
datastructure1.cpp 定義控制台應用程式的入口點。include stdafx.h include include includeusing namespace std define maxsize 4000 可排序表的最大長度 define sortnum 6 測試6中排序方法 d...
內排序演算法總結 快速排序
快速排序 快速排序是一種在含n個數的輸入陣列上最壞情況執行時間為o n2 的演算法,平均效能的期望執行時間為o nlgn 且o nlgn 記號中隱含的常數因子很小。另外,它還能夠進行原地置換排序。快速排序是基於分治模式上的,分治過程三個步驟 1.分解 把陣列a p.r 分成兩個非空子陣列a p.q ...
基礎複習 內排序 查詢演算法
內排序void mkarr int arr,int size void checksorted int arr,int size,int flag else printf all right n 1.插入排序 假設陣列的前i個數已經排好序,然後將第i 1個數插入到前i個中,只到n個數都插入到自己的位...