排序算法總結(精講*C語言介紹)

冒泡排序

如下代碼皆從小到大進行排序

冒泡排序原理算法

  • O(n^2)
  • 顧名思義,就是如同魚兒在水中冒泡同樣。好比(從小到大)就將最大的往上冒;固然,這就須要交換2個數的值了,話很少說,直接上餐
#include<stdio.h>

void Bubble_Sort(int a[],int n){   //冒泡排序
	for(int i=0;i<n-1;i++){   //外層只需遍歷到倒數第2個數
		for(int j=i;j<n;j++){  
			if(a[i]>a[j]){
				int temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
		}
	}
} 
int main(){
	int a[10]={2,1,3,4,5,6,7,8,9,0};
	Bubble_Sort(a,10);
	for(int i=0;i<10;i++){
		printf("%d ",a[i]);
	}
}

插入排序原理數組

  • O(n^2)相對冒泡較優化;
  • 最開始假如1個數(確定有序),接着插入一個數,若比前一個數大,直接插入,若比前一個數小,則將前一個數後移,再將待排序的數放到這個數前;此時爲有序。
  • 對一個數組進行排序相似,好比如今有10個int大的數組,設前2個爲有序,第3個數小於第2個,小於第1個,因此你須要將第3個插入到第1和2兩個數中間,接着,先把第3個數保存起來,即定義1個新變量,將第3個數賦值給它,
    將第2個數日後移,蓋掉第3個,再用將定義的變量蓋掉第2個,以此類推,使整個數組變爲有序。
#include<stdio.h> 
void Insert_Sort(int a[],int n){    //插入排序
	for(int i=1;i<n;i++){
		int x=a[i];
		int j=i-1;
		for(;j>=0 && x<a[j];j--){
			a[j+1]=a[j];
		}
		a[j+1]=x;
	}
}

int main(){
	int a[10]={2,1,3,4,5,6,7,8,9,0};
	Insert_Sort(a,10);
	for(int i=0;i<10;i++){
		printf("%d ",a[i]);
	}
}

選擇排序原理markdown

  • O(n^2)相對冒泡較優化
  • 感受這個和冒泡差很少,關鍵在於下標的用法,給出代碼,你們本身琢磨下
#include<stdio.h>

void Selection_Sort(int a[],int n){      //選擇排序
	for(int i=0;i<n-1;i++){
		int num=i;
		for(int j=i+1;j<n;j++){
			if(a[num] > a[j]) num=j;
			if(num!=i) {
				int temp=a[i];
				a[i]=a[num];
				a[num]=temp;
			}
		}
	}
}
int main(){
	int a[10]={2,1,3,4,5,6,7,8,9,0};
	Selection_Sort(a,10);
	for(int i=0;i<10;i++){
		printf("%d ",a[i]);
	}
}

快速排序原理ide

  • 這個之因此執行效率較高 O(logn),是由於進行了分治,也就是將整個數組分紅2個,使右邊的都是大於最中間的數,左邊的都是小於最中間的數;
  • 再者,遞歸左右兩邊,知道整個數組有序,給出代碼;
#include<stdio.h>

void Quick_Sort(int l,int r,int a[]) {   //快速排序
	int i=l,j=r;
	int mid=(i+r)/2;
	do{
		while(a[i]< a[mid]) i++;
		while(a[j]> a[mid]) j--;
		if(i<=j) {
			int temp=a[i];
			a[i]=a[j];
			a[j]=temp;
		    i++;
		    j--;
		    
		}
	}while(i<= j);
	if(l< j) Quick_Sort(l,j,a);
	if(i< r) Quick_Sort(i,r,a);	
} 
int main(){
	int a[10]={2,1,3,4,5,6,7,8,9,0};
	Quick_Sort(0,9,a);
	for(int i=0;i<10;i++){
		printf("%d ",a[i]);
	}
}

桶排序原理優化

  • 這個算法執行效率較高,不過空間複雜度也高,固然,如今的電腦空間換時間 確定划算;
    • 這是桶排序的簡單版本,固然對於排序簡單數組等夠用了,後序給出桶排序正宗版本,相對較複雜;
  • 桶排序須要另外申請數組,將要排序的數組的值存到申請數組中,而且要和申請述責的下標相等,這就要申請一個內存與 待排序數組中最大的數的值相等的數組,下面給出代碼;
#include<stdio.h>

int main(){
	int a[5]={2,3,3,5,8};
	
	int b[10];
	memset(b,0,sizeof(int)*10);
	
	
	for(int i=0;i<5;i++){
		b[a[i]]++;
	}
	for(int i=0;i<10;i++){
		for(int j=0;j<b[i];j++){
			printf("%d ",i);
		}
	}
}

歸併排序原理ui

  • 這個就須要理解了,相對較複雜,可是相應的執行效率較高;
  • 主要分爲拆分和合並,最開始我也好懵,可是直到我找到一張圖,瞬時恍然大悟,感受也不過如此,下面分享給你們;

這裏是引用
這裏是引用

  • 下面給出代碼;
#include<stdio.h>
#include<string.h>
void combine(int a[],int l,int mid,int r) {   //合併
	int b[100];
	memset(b,0,sizeof(int)*100);
	int k=0;
	int i=l,j=mid;
	while(i<mid && j<=r){
		if(a[i]<=a[j]) b[k++]=a[i++];
		else b[k++]=a[j++];
	}
	while(j<=r) b[k++]=a[j++];
	while(i<mid) b[k++]=a[i++];
	for(int i=l;i<=r;i++) a[i]=b[i-l];
}
void Guibing_Sort(int a[],int left,int right){   //拆分
	if(left==right) return ;
	
	int mid=(left + right)/2;
	Guibing_Sort(a,left,mid);
	Guibing_Sort(a,mid+1,right);
	combine(a,left,mid+1,right);
}

int main(){
	int a[10]={2,1,3,4,5,6,7,8,9,0};
	Guibing_Sort(a,0,9);
	for(int i=0;i<10;i++){
		printf("%d ",a[i]);
	}
}

歡迎指出不足的地方,謝謝瀏覽,互勉!atom

相關文章
相關標籤/搜索