五種基本排序

2021-07-09 11:30:26 字數 4079 閱讀 9926

最近在看資料結構,想把幾個簡單的排序在過一遍,發現還沒那麼容易,最簡單的氣泡排序**沒那麼容易敲出來。下面把5種排序複習一下:

1. 氣泡排序:

氣泡排序是最簡單也是最常用的排序方法。其基本思想是(以公升序為例):將序列看成一排豎著的氣泡。最後乙個元素與倒數第二個元素進行比較,小的往前拱,再將倒數第二個元素與倒數第三個元素比較,小的往前拱,...這樣一次外迴圈後,第乙個元素就是序列最小的元素。n次外迴圈後就將序列排列好了。具體的程式如下:

[cpp]view plain

copy

"font-size:14px;"> int temp;  

int num=0;  

int a[10]=;  

for(int i=0;i<10;i++)  

for(int j=9;j>=i;j--)  

}  for (i=0;i<10;i++)  

printf("\n");  

printf("%d\n",num);  

改進後的氣泡排序演算法:

氣泡排序是每次將最小的數往上推(通過由下往上的兩兩比較),但有的時候序列已經有一定順序了,每次再去比較就會浪費時間。所以可以設立乙個flag,當某一次比較沒有資料發生交換時,證明已經排好了,後面的就不去用再繼續了。具體程式如下:

[cpp]view plain

copy

"font-size:14px;">int temp;  

int num=0;  

bool flag=false;  

int a[10]=;  

for(int i=0;i<10 && !flag;i++)  

}  }    

for (i=0;i<10;i++)  

printf("\n");  

printf("%d\n",num);  

2.直接插入排序:

直接插入排序的思想是:把乙個數插入到乙個有序序列中,原先的序列已經是排好的了,所以要先要找到該元素的位置,將原先的序列移動,然後再將數字插入。**如下:

[cpp]view plain

copy

"font-size:14px;">if(is_full(parr))  

return

false;  

if(pos<1 || pos>parr->cnt+1)  

return

false;  

for (int i=parr->cnt-1;i>=pos-1;i--)  

parr->pbase[i+1]=parr->pbase[i];  

parr->pbase[pos-1]=val;  

parr->cnt++;  

直接插入也可以改進,改進後的插入排序時邊比較邊移動的,當找到合適的位置時就直接插入。**如下:

[cpp]view plain

copy

"font-size:14px;">if(is_full(parr))  

return

false;  

int pos=parr->cnt-1;  

for (int i=pos;i>=0;i--)  

else

}  parr->cnt++;  

3.快速排序:

快速排序是效率比較高的排序演算法,其又細分為幾種,不過基本思想是一樣的。只要思想是:選定序列的第乙個數,先找到該數的真實位置,然後將序列以這個數分為兩個部分,左邊又選定第乙個數,找到該數的真實位置,右邊也選定第乙個數,找到該數的真實位置,....不斷找到子串行第乙個數的真實位置,實際上是乙個遞迴的過程。至於第乙個數的真實位置時如何確定的,是同過兩個標記來實現的,每次都與這個數比較進行移動或者賦值,具體見**:

[cpp]view plain

copy

"font-size:14px;">#include 

void quicksort(int* a,int low,int high); //陣列名和指標可以互用

int findpos(int* a,int low,int high); //找到第乙個元素的真實位置

int main()  

;  quicksort(a,0,5); //low 為 0,high 為 5

for(int i=0;i<6;i++)  

printf("%d ",a[i]);  

printf("\n");  

return 0;  

}  //遞迴實現

//快速排序的思想:先找到第乙個元素的真實位置,在將其左右兩部分分成兩個序列,繼續查詢序列的第乙個元素的真實位置

void quicksort(int* a,int low,int high)  

}  int findpos(int*a,int low,int high)  

a[low]=val; //最後low於high就指向了第乙個元素的真實位置

return low;  

}  

4.選擇排序

選擇排序與氣泡排序類似;其基本思想是:假設開始有0個有序數和n個無序數,經過一次排序後就變成了1個有序數和n-1個有序數了...,每一次排序都使有序數的個數+1,無序數的個數減一。主要**如下:

[cpp]view plain

copy

"font-size:14px;">int temp,b;  

int num=0;  

int a[10]=;  

for(int i=0;i<10;i++)  

if (i!=temp)  

}  *當n的次數較小時,選擇排序比氣泡排序快。

5.歸併排序

歸併排序相對來說比較複雜,也沒有多研究,就看一下大概的思想和**。主要的思想是:將序列等分排序,將序列分為兩個子串行,再排好兩個子串行後將其合併起來。子串行的排序有和主序列類似,也是將其分為兩個子串行,...最後將所有序列歸併起來即可(也是利用了遞迴的方法)。主要**:

[cpp]view plain

copy

"font-size:14px;">#include

// 乙個遞迴函式

void mergesort(int *num,int start,int end);  

// 這個函式用來將兩個排好序的陣列進行合併

void merge(int *num,int start,int middle,int end);  

int main();     

int i;  

// 排序之前 

printf("before sorting:\n");      

for (i=0; i<10; i++)      

printf("\n");     

// 進行合併排序   

mergesort(num,0,9);   

printf("after sorting:\n");   

// 排序之後 

for (i=0; i<10; i++)      

printf("\n");     

return 0;  

}  //這個函式用來將問題細分

void mergesort(int *num,int start,int end)  

}  //這個函式用於將兩個已排好序的子串行合併

void merge(int *num,int start,int middle,int end)  

// 哨兵元素   

*(l+n1)=1000000;      

for (i=0; i     

*(r+n2)=1000000;      

i=0;      

// 進行合併 

for (k=start; k<=end; k++)      

else

}     

delete  l;      

delete  r;  

}

五種排序的思想及其基本實現

五種排序的思想及其基本實現 1.簡介 這兩天重學了氣泡排序 插入排序 選擇排序 歸併排序 快速排序,這五種排序,現就學到知識做以總結,我的 風格有所變化,注釋不僅成塊出現,而且用了英語,語句中的空白運用也有所變化。2.演算法分析 a.氣泡排序 在序列中從左到右比較相鄰的兩個元素,若右邊元素小於左邊元...

五種排序演算法 快速排序

1 在陣列中選乙個基準數 通常為陣列第乙個 2 將所有比基準值小的值擺放在基準的前面,所有比基準值大的擺放在基準的後面 相同的數可以放到任意一邊 在這個分割槽推出之後,該基準就處於數列的中間位置。3 遞迴地把 基準值前面的子數列 和 基準值後面的子數列 進行排序。下面以數列a 30,40,10,20...

五種排序演算法 選擇排序

選擇排序 selection sort 是一種簡單直觀的排序演算法。其基本思想是 首先在未排序的數列中查詢到最小或最大元素,然後將其存放到數列到起始位置 接著,再從剩餘未排序的元素中繼續尋找最小或最大的元素,放到以排序序列的末尾。依此類推,直到所有元素排序完畢。以數列為例,演示其選擇排序過程如下圖所...