欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言面試常見考點(diǎn)排序總結(jié)

 更新時(shí)間:2021年11月23日 10:53:40   作者:悟道xn  
深處開發(fā)崗,其實(shí)排序也是繞不開的環(huán)節(jié),其中冒泡排序,選擇排序,插入排序,歸并排序,快速排序,堆排序也是我在秋招以來(lái)頻繁問(wèn)到的技術(shù)點(diǎn),今天我們來(lái)重點(diǎn)聊聊排序

排序算法有兩塊比較重要的知識(shí)點(diǎn)

  • 內(nèi)存消耗 :算法的內(nèi)存消耗可以通過(guò)空間復(fù)雜度來(lái)衡量,排序算法也不例外。不過(guò),針對(duì)排序算法的空間復(fù)雜度,有一個(gè)概念是原地排序。原地排序算法是指空間復(fù)雜度是O(1)的排序算法。其中冒泡排序,插入排序、選擇排序都屬于原地排序算法
  • 穩(wěn)定性:針對(duì)排序算法,我們還有一個(gè)衡量指標(biāo)是穩(wěn)定性。這個(gè)概念是說(shuō),如果待排序的序列中存在值相等的元素,經(jīng)過(guò)排序之后,相等元素之間原有的先后順序不變。

例如我們有一組數(shù)據(jù) 2 9 3 4 8 3 按照從小到大的排序是 2 3 3 4 8 9,經(jīng)過(guò)某種排序算法之后,如果兩個(gè)3的前后順序沒(méi)有改變,就稱為穩(wěn)定的排序算法,否則就是不穩(wěn)定的排序算法

算法名稱 時(shí)間復(fù)雜度 是否穩(wěn)定排序 是否原地排序
冒泡排序 O(N^2)
插入排序 O(N^2)
選擇排序 O(N^2)
歸并排序 O(nlogn)
快速排序 O(nlogn)
堆排序 O(nlogn)

冒泡排序

  • 平均復(fù)雜度是O(N^2)
  • 最好情況是O(1) 本身就是排好序的
  • 最壞就是倒序O(N^2)
  • 空間復(fù)雜度是O(1)

冒泡排序只會(huì)操作相鄰的兩個(gè)數(shù)據(jù)。每次冒泡操作都會(huì)對(duì)相鄰的兩個(gè)元素進(jìn)行比較,看是否滿足大小關(guān)系要求。如果不滿足就讓它倆互換。一次冒泡會(huì)讓至少一個(gè)元素移動(dòng)到它應(yīng)該在的位置,重復(fù) n 次,就完成了 n 個(gè)數(shù)據(jù)的排序工作。

class Sort{
public:
	void MaoPao_Sort(vector<int> &arr){
		//1.判斷溢出條件
		if(arr.size() <2) return;
		int length =arr.size(); 
		for(int i =0;i < length;i++){
			for(int j=0; j < length -i -1 ;j++){
				if(arr[j] >arr[j+1]){
					int temp = arr[j];
					arr[j]= arr[j+1];
					arr[j+1]=temp;
				}
			}
		}
	}		
};

插入排序

插入排序思想的由來(lái),其實(shí)就是按照在一個(gè)有序的數(shù)組中插入一個(gè)元素的思想,找到合適的位置進(jìn)行插入并遷移后面的元素

首先,我們將數(shù)組中的數(shù)據(jù)分為兩個(gè)區(qū)間,已排序區(qū)間和未排序區(qū)間。初始已排序區(qū)間只有一個(gè)元素,就是數(shù)組的第一個(gè)元素。插入算法的核心思想是取未排序區(qū)間中的元素,在已排序區(qū)間中找到合適的插入位置將其插入,并保證已排序區(qū)間數(shù)據(jù)一直有序。重復(fù)這個(gè)過(guò)程,直到未排序區(qū)間中元素為空,算法結(jié)束。

class Sort{
public:
	void Insert_Sort(vector<int> &arr){
		//1.判斷溢出條件
		if(arr.size() < 2) return;
		int length =arr.size();
		int j =0;//初始的已排序區(qū)間的下標(biāo) 
		for(int i =1;i < length ;i++){ //從未排序的區(qū)間里面取元素
			int temp =arr[i];
			j =i-1;    //不斷更新已排序區(qū)間
			while(j >= 0 && temp <a[j]){
				//如果小的話就往后移動(dòng),找到合適的插入位置 
				arr[j+1]=arr[j];
				j--; 
			} 
			arr[j+1]=temp;  //插入元素 
		} 
	}
};

選擇排序

選擇排序算法的實(shí)現(xiàn)思路有點(diǎn)類似插入排序,也分已排序區(qū)間和未排序區(qū)間。但是選擇排序每次會(huì)從未排序區(qū)間中找到最小的元素,將其放到已排序區(qū)間的末尾

class Sort{
public:
	void Select_Sort(vector<int> &arr ,int length){
		for(int i =0;i < length -1;i++){
			int min_number =arr[i];
			int flag = i;
			for(int j =i;j <length ;j++){
				if(min_number > arr[j]){
					min_number = arr[j];
					flag =j;
				}
			}
			//交換數(shù)字
			arr[flag] =arr[i];
			arr[i]=min_number; 
		}
	}
}; 

歸并排序

歸并排序是由下而上,采用分治的思想,把數(shù)據(jù)先拆分在合并,并把合并后的數(shù)據(jù)存入臨時(shí)數(shù)組中,保證原先的數(shù)據(jù)位置不發(fā)生變化,是一種穩(wěn)定的排序但不是原地排序,時(shí)間復(fù)雜度是O(nlogn),空間復(fù)雜度是O(N)

class Sort{
public:
	//歸并排序 
	void MergeSort(vector<int> & arr){
		if(arr.size() < 2){
			return ;
		} 
		//拆分函數(shù) 
		Merge_Process(arr,0,arr.size())-1);
	}
	//先拆分,這是拆分函數(shù) 
	void Merge_Process(vector<int> &arr,int start,int end){
		//遞歸拆分,首先需要遞歸的終止條件
		if(end -start == 0) return;
		int mid =((end -start)/2) +start;
		Merge_Process(arr,start,mid);
		Merge_Process(arr,mid+1,end);
		//在合并
		Merge(arr,start,mid,end); 
	} 
	//合并函數(shù)
	void Merge(vector<int> &arr,int start,int mid, int end){
		vector<int> temp(end-start+1,0);//初始化一個(gè)臨時(shí)數(shù)組
		int tempIndex =0; //輔助空間索引
		int leftIndex =start;
		int rightIndex =mid+1;
		while(leftIndex <= mid && rightIndex <= end){
			if(leftIndex <rightIndex){
				temp[tempIndex++] =arr[leftIndex++]; 
			}else{
				temp[tempIndex++] =arr[rightIndex++];
			}	 
		}
		while(leftIndex <= mid){
			temp[tempIndex++]=arr[leftIndex++];
		} 
		while(rightIndex <= end){
			temp[tempIndex++]=arr[rightIndex++];
		}
		for(int i =0;i< temp.size();i++){
			arr[start+i]=temp[i];
		}
	}
}; 

快速排序

快速排序是先分區(qū),在處理子問(wèn)題,通過(guò)找到區(qū)間后取得任意一個(gè)分區(qū)點(diǎn),小的放分區(qū)點(diǎn)左邊,大的放分區(qū)點(diǎn)右邊,時(shí)間復(fù)雜度是O(nlong),空間復(fù)雜度是O(1),是原地排序但不是穩(wěn)定排序

快排優(yōu)化的話,有:三數(shù)取中法,和隨機(jī)法,都是為了防止要排序的數(shù)組中有重復(fù)元素,這塊我演示的是隨機(jī)法

class Sort{
public:
	void quickSort(vector<int> &arr,int begin, int low){
		if(begin <end){
			//產(chǎn)生一個(gè)隨機(jī)值 
			int index =rand()%(end-begin+1)+begin;
			//然后把產(chǎn)生的這個(gè)隨機(jī)值,替換到數(shù)組的首位 
			swap(arr[begin],arr[index]); 
			int i =begin;
			int j =end;
			int base =arr[i];//基準(zhǔn)位
			while(i <j){
				while(i<j&& arr[j] >= base){
					j--;
				}
				num[i]=num[j];
				while(i<j && arr[i] < base){
					i++;
				}
				num[j]=num[i];
			}
			//回歸基準(zhǔn)位 
			num[i]=base;
			//遞歸開始處理子問(wèn)題 
			quickSort(arr,begin,i-1);
			quickSort(arr,i+1,end); 
			 
		}
	}
}; 

以上就是C語(yǔ)言面試常見考點(diǎn)排序總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言 排序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++設(shè)計(jì)模式之迭代器模式

    C++設(shè)計(jì)模式之迭代器模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之迭代器模式,本文講解了什么是迭代器模式、迭代器模式的代碼實(shí)例等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C++實(shí)現(xiàn)飛機(jī)訂票系統(tǒng)

    C++實(shí)現(xiàn)飛機(jī)訂票系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)飛機(jī)訂票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之循環(huán)鏈表的簡(jiǎn)單實(shí)例

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之循環(huán)鏈表的簡(jiǎn)單實(shí)例

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之循環(huán)鏈表的簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • c語(yǔ)言中exit和return的區(qū)別點(diǎn)總結(jié)

    c語(yǔ)言中exit和return的區(qū)別點(diǎn)總結(jié)

    小編今天給大家整理了關(guān)于c語(yǔ)言中exit和return的不同點(diǎn)及相關(guān)基礎(chǔ)知識(shí)點(diǎn),有興趣的朋友們可以跟著學(xué)習(xí)下。
    2021-10-10
  • Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)文件編碼格式識(shí)別

    Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)文件編碼格式識(shí)別

    在做數(shù)據(jù)導(dǎo)入導(dǎo)出的過(guò)程中,如果應(yīng)用場(chǎng)景多了,相信各位都會(huì)遇到一個(gè)問(wèn)題就是文件編碼的問(wèn)題。本文將用Qt實(shí)現(xiàn)文件編碼格式識(shí)別,感興趣的可以了解一下
    2022-06-06
  • C++實(shí)現(xiàn)屏幕截圖(全屏截圖)

    C++實(shí)現(xiàn)屏幕截圖(全屏截圖)

    屏幕截圖已經(jīng)成為了所有IM即時(shí)通訊軟件的必備模塊,也是日常辦公中使用最頻繁的功能之一。今天我們從C++開發(fā)的角度,來(lái)看看屏幕截圖的主要功能點(diǎn)是如何實(shí)現(xiàn)的,感興趣的可以了解一下
    2021-11-11
  • Qt編寫地圖綜合應(yīng)用之繪制雨量分布

    Qt編寫地圖綜合應(yīng)用之繪制雨量分布

    雨量分布圖是在區(qū)域地圖基礎(chǔ)上,針對(duì)區(qū)域中的每個(gè)最小單位區(qū)域比如縣城點(diǎn)位不同顏色顯示。本文將詳細(xì)為大家介紹如何通過(guò)QT編寫繪制雨量分布,感興趣的小伙伴可以了解一下
    2021-12-12
  • C++自動(dòng)生成迷宮游戲

    C++自動(dòng)生成迷宮游戲

    這篇文章主要為大家詳細(xì)介紹了C++自動(dòng)生成迷宮游戲,運(yùn)用并查集自動(dòng)生成迷宮地圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++指針與引用的區(qū)別案例詳解

    C++指針與引用的區(qū)別案例詳解

    這篇文章主要介紹了C++指針與引用的區(qū)別案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++掃雷游戲的簡(jiǎn)單制作

    C++掃雷游戲的簡(jiǎn)單制作

    這篇文章主要為大家詳細(xì)介紹了C++掃雷游戲的簡(jiǎn)單制作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評(píng)論