新聞中心
1、插入排序
成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)嘉善,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
插入排序的工作原理是建立有序序列,對(duì)于未排序數(shù)據(jù),在已排序的數(shù)據(jù)從后先前掃描,找到對(duì)應(yīng)的位置后插入。
①?gòu)牡谝粋€(gè)元素開始,該元素被默認(rèn)為有序序列。
②從下一個(gè)未排序數(shù)據(jù)開始,在已經(jīng)排序的序列中從后往前掃描
③如果該元素小于已排序的元素,繼續(xù)往前掃描
④重復(fù)③,直到找到該元素大于或等于已排序的元素的位置
⑤插入該元素
⑥重復(fù)②
代碼:
void InsertSort(int *a,int size) { assert(a); for (int i = 1; i < size; i++) { int index = i; int end = index - 1; //已排序序列最后一個(gè)元素下標(biāo) int temp = a[index]; //保存未排序數(shù)據(jù)的值 while (end >= 0 && temp < a[end]) { a[end + 1] = a[end]; //當(dāng)為排序數(shù)據(jù)小于已排序序列數(shù)據(jù)時(shí),把已排序數(shù)據(jù)向后移一位 end--; //繼續(xù)往前掃描 } a[end + 1] = temp; //找到未排序數(shù)據(jù)大于或等于已排序序列,或者整個(gè)已排序序列沒有一個(gè)數(shù)小于未排序數(shù)據(jù)時(shí) } }
插入排序?qū)缀跻呀?jīng)排好序的數(shù)據(jù)進(jìn)行操作時(shí),效率很高。但插入排序一般來(lái)說(shuō)是低效的,每次只能挪動(dòng)數(shù)據(jù)一位。
2、選擇排序
選擇排序的思想是每一趟從待排序的數(shù)據(jù)元素中選出最小的一個(gè)元素,順序放在已排好序的數(shù)列的最前,直到全部待排序的數(shù)據(jù)元素排完。
void SelectSort(int *a,int size)
{
assert(a);
for(int i=0;i { int min=i; for(int j=i+1;j { if(a[min]>a[j]) min=j; } swap(a[i],a[min]); } } 還可以優(yōu)化,我們可以在選出最小的元素放在序列頭的同時(shí),選出最大的元素放在序列尾 3、冒泡排序 從第一個(gè)元素開始,對(duì)數(shù)組中兩兩相鄰的元素比較,將值較小的元素放在前面,值較大的元素放在后面,一輪比較完畢,一個(gè)最大的數(shù)沉底成為數(shù)組中的最后一個(gè)元素,一些較小的數(shù)如同氣泡一樣上浮一個(gè)位置。 4、希爾排序 希爾排序其實(shí)是更優(yōu)化的插入排序。 其思想為: 把記錄按步長(zhǎng) gap 分組,對(duì)每組記錄采用直接插入排序方法進(jìn)行排序。隨著步長(zhǎng)逐漸減小,所分成的組包含的記錄越來(lái)越多,當(dāng)步長(zhǎng)的值減小到 1 時(shí),整個(gè)數(shù)據(jù)合成為一組,構(gòu)成一組有序記錄,則完成排序。void SelectSort(int *a, int size)
{
assert(a);
for (int left = 0, right = size - 1;left<=right;left++,right--)
{
int max = right, min = left;
for (int i = left; i <= right; i++)
{
if (a[min] > a[i])
swap(a[min],a[i]);
if (a[max] < a[i])
swap(a[max],a[i]);
}
swap(a[min], a[left]);
swap(a[max], a[right]);
}
void BubSort(int* a,int size)
{
for (int i = 0; i < size; i++)
{
int symbol = false;
for (int j = 1; j < size - i ; j++)
{
if (a[j] < a[j - 1])
swap(a[j], a[j - 1]);
symbol = true;
}
if (symbol == false) //當(dāng)symbol為false時(shí),就說(shuō)明后面的已經(jīng)有序
break;
}
}
void ShellSort(int *a, int size)
{
assert(a);
int gap = size;
while (gap > 1)
{
gap = gap / 3 + 1;
for (int i = gap; i < size; i++)//比如當(dāng)gap=4時(shí),并不是讓它分別進(jìn)行4組插入排序,而是采用一種比較巧的方法,讓i從gap開始每次加1,這樣就能把4組插入排序,一次走完
{
int index = i;
int temp = a[index];
int end = index - gap;
while (end >= 0 && temp
文章題目:常用的簡(jiǎn)單排序之插入排序,冒泡排序,選擇排序,希爾排序
標(biāo)題來(lái)源:http://fisionsoft.com.cn/article/igcjjd.html