最近在看資料結構,想把幾個簡單的排序在過一遍,發現還沒那麼容易,最簡單的氣泡排序**沒那麼容易敲出來。下面把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 是一種簡單直觀的排序演算法。其基本思想是 首先在未排序的數列中查詢到最小或最大元素,然後將其存放到數列到起始位置 接著,再從剩餘未排序的元素中繼續尋找最小或最大的元素,放到以排序序列的末尾。依此類推,直到所有元素排序完畢。以數列為例,演示其選擇排序過程如下圖所...