內排序算法的整理(一)
阿新 • • 發佈:2018-08-22
至少 發生 元素 n個元素 color 技術分享 ++ 結果 快速排序算法
對各種內排序算法進行了整理,不足的日後補充。
1.冒泡排序
冒泡排序屬於交換排序,其基本思想是通過無序區中相鄰元素關鍵字間的比較和位置的交換使關鍵字最小的元素如氣泡一般逐漸往上“漂浮”至“水面”,該算法時間復雜度為O(n^2)。
偽代碼如下:
void BubbleSort(RecType R[],int n) { int i,j; for(i=0;i<n-1;i++) for(j=n-1;j>i;j--) //將R[i]元素歸位 if(R[j].key<R[j-1].key) //相鄰的兩個元素反序時swap(R[j],R[j-1]); //將R[j]和R[j-1}兩個元素交換 }
C++代碼如下:
1 #include<iostream> 2 using namespace std; 3 4 void BubbleSort(int a[],int n) 5 { 6 int i,j; 7 for(i=0;i<n-1;i++) 8 for(j=n-1;j>i;j--) 9 if(a[j]<a[j-1]) 10 { 11 intc; 12 c=a[j-1]; 13 a[j-1]=a[j]; 14 a[j]=c; 15 } 16 17 } 18 int main() 19 { 20 int i; 21 int a[10]={8,4,6,2,5,1,0,43,17,42}; 22 BubbleSort(a,10); 23 for(i=0;i<10;i++) 24 cout<<a[i]<<endl; 25 26return 0; 27 }
運行結果:
2.梳排序
梳排序是冒泡排序的改進算法,算法思路是將冒泡排序中不需要進行元素交換的比較過程跳過。
偽代碼如下:
Humble寒露的個人空間 C/C++ 正文 內排序算法的整理(一) 原 Humble寒露 Humble寒露 發布於 07/22 18:33 字數 1040 閱讀 3 收藏 0 點贊 0 評論 0 管理 對各種內排序算法進行了整理,不足的日後補充。 1.冒泡排序 冒泡排序屬於交換排序,其基本思想是通過無序區中相鄰元素關鍵字間的比較和位置的交換使關鍵字最小的元素如氣泡一般逐漸往上“漂浮”至“水面”,該算法時間復雜度為O(n^2)。 偽代碼如下: void BubbleSort(RecType R[],int n) { int i,j; for(i=0;i<n-1;i++) for(j=n-1;j>i;j--) //將R[i]元素歸位 if(R[j].key<R[j-1].key) //相鄰的兩個元素反序時 swap(R[j],R[j-1]); //將R[j]和R[j-1}兩個元素交換 } C++代碼如下: #include<iostream> using namespace std; void BubbleSort(int a[],int n) { int i,j; for(i=0;i<n-1;i++) for(j=n-1;j>i;j--) if(a[j]<a[j-1]) { int c; c=a[j-1]; a[j-1]=a[j]; a[j]=c; } } int main() { int i; int a[10]={8,4,6,2,5,1,0,43,17,42}; BubbleSort(a,10); for(i=0;i<10;i++) cout<<a[i]<<endl; return 0; } 運行結果: 2.梳排序 梳排序是冒泡排序的改進算法,算法思路是將冒泡排序中不需要進行元素交換的比較過程跳過。 偽代碼如下: void BubbleSort1(RecType R[],int n) { int i,j; bool exchange; for(i=0;i<n-1;i++) { exchange=false; //一趟前exchange置為假 for(j=n-1;j>i;j--) //歸位R[i],循環n-i-1次 if(R[j].key<R[j-1].key) //相鄰兩個元素反序時 { swap(R[j],R[j-1]); //將R[j]和R[j-1}兩個元素交換 exchange=true; //一旦有交換,exchange置為真 } if(!exchange) //本趟沒有發生交換,中途結束算法 return; } }
C++代碼如下:
1 #include<iostream> 2 using namespace std; 3 4 void BubbleSort1(int a[],int n) 5 { 6 int i,j; 7 bool exchange; 8 for(i=0;i<n-1;i++) 9 { 10 exchange=false; 11 for(j=n-1;j>i;j--) 12 if(a[j]<a[j-1]) 13 { 14 int c; 15 c=a[j-1]; 16 a[j-1]=a[j]; 17 a[j]=c; 18 exchange=true; 19 } 20 if(!exchange) 21 return; 22 } 23 } 24 int main() 25 { 26 int i; 27 int a[10]={8,4,6,2,5,1,0,43,17,42}; 28 BubbleSort1(a,10); 29 for(i=0;i<10;i++) 30 cout<<a[i]<<endl; 31 32 return 0; 33 }
運行結果:
3.快速排序
快速排序算法思路是在待排序的n個元素中任取一個元素作為基準,把該元素放入適當位置後,數據序列被此元素劃分成兩部分。所有關鍵字比該元素關鍵字小的元素放置在前一部分,所有比它大的元素放置在後一部分,並把該元素排在這兩部分的中間,這個過程稱為一趟快速排序,即一趟劃分。
偽代碼如下:
int partition(RecType R[],int s,int t) //一趟劃分 { int i=s,j=t; RecType tmp=R[i]; //以R[i]為基準 while(i<j) //從兩端交替向中間掃描,直至i=j為止 { while(j>i && R[j].key>=tmp.key) j--; //從右向左掃描,找一個小於tmp.key的R[j] R[i]=R[j]; //找到這樣的R[j],放入R[i]處 while(i<j && R[i].key<=tmp.key) i++; //從左向右掃描,找一個大於tmp.key的R[i] R[j]=R[i]; //找到這樣的R[i],放入R[j]處 } R[i]=tmp; return i; } void QuickSort(RecType R[],int s,int t) //對R[s..t]的元素進行快速排序 { int i; if(s<t) //區間內至少存在兩個元素的情況 { i=partition(R,s,t); QuickSort(R,s,i-1); //對左區間遞歸排序 QuickSort(R,i+1,t); //對右區間遞歸排序 } }
C++代碼如下:
1 #include<iostream> 2 using namespace std; 3 4 int partition(int a[],int s,int t) 5 { 6 int i=s,j=t; 7 int tmp=a[i]; 8 while(i<j) 9 { 10 while(j>i && a[j]>=tmp) 11 j--; 12 a[i]=a[j]; 13 while(i<j && a[i]<=tmp) 14 i++; 15 a[j]=a[i]; 16 } 17 a[i]=tmp; 18 return i; 19 } 20 21 void QuickSort(int a[],int s,int t) 22 { 23 int i; 24 if(s<t) 25 { 26 i=partition(a,s,t); 27 QuickSort(a,s,i-1); 28 QuickSort(a,i+1,t); 29 } 30 } 31 32 int main() 33 { 34 int i; 35 int a[10]={8,4,6,2,5,1,0,43,17,42}; 36 QuickSort(a,0,9); 37 for(i=0;i<10;i++) 38 cout<<a[i]<<endl; 39 40 return 0; 41 }
運行結果:
內排序算法的整理(一)