最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言所有經(jīng)典排序方法的實現(xiàn)代碼

 更新時間:2021年06月02日 09:43:52   作者:江軍峰  
這篇文章給大家分享C語言所有經(jīng)典排序方法,文章給大家提供完整的實例代碼幫助大家快速學習掌握C語言排序方法,感興趣的朋友一起看看吧

運行結果正確
還是快速排序難一些。

在這里插入圖片描述

完整代碼

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include<malloc.h>
void swap(int *a,int *b);
void select_sort(int arr[],int n);
void tra_arr(int arr[],int n);
void insert_sort(int arr[],int n); 
void shell_sort(int arr[],int n);
void perc_down(int arr[],int i,int n);
void heap_sort(int arr[],int n);
void merge(int arr[],int temp_arr[],int left_start,int right_start
			,int right_end);
void m_sort(int arr[],int temp_arr[],int left,int right);
void merge_sort(int arr[],int n);
int get_pri(int arr[],int left,int right);
void q_sort(int arr[],int left,int right);
void quick_sort(int arr[],int n);
int main(){
	int arr[100]={
		10,9,8,7,6,5,4,3,2,1
	};
	select_sort(arr,10);
	printf("\n簡單選擇排序結果\n");
	tra_arr(arr,10);
	
	int arr1[100]={
		10,9,8,7,6,5,4,3,2,1
	};
	insert_sort(arr1,10);
	printf("\n插入排序結果\n");
	tra_arr(arr1,10);
	
	int arr2[100]={
		10,9,8,7,6,5,4,3,2,1
	};
	shell_sort(arr2,10);
	printf("\n希爾排序結果\n");
	tra_arr(arr2,10);
	
	int arr3[100]={
		10,9,8,7,6,5,4,3,2,1
	};
	heap_sort(arr3,10);
	printf("\n堆排序結果\n");
	tra_arr(arr3,10);
	
	int arr4[100]={
		 10,9,8,7,6,5,4,3,2,1
	};
	merge_sort(arr4,10);
	printf("\n歸并排序結果\n");
	tra_arr(arr4,10);
	
	int arr5[100]={
		 10,9,8,7,6,5,4,3,2,1
	};
	quick_sort(arr5,10);
	printf("\n快速排序結果\n");
	tra_arr(arr5,10);
	
	return 0;
}
void swap(int *a,int *b){
	//在函數(shù)內部,如果打算接收的是指針的地址,那就不要加*,
	//如果想要的是值,那就加*,我也很討厭指針,但是沒辦法 
	int t=*a;
	*a=*b;
	*b=t;
}
//簡單選擇排序 
void select_sort(int arr[],int n){
	int min;
	//這個過程一時半會講不清楚,看書會清楚一些 
	for(int i=0;i<n;i++){
		min=i;
		
		for(int j=i+1;j<n;j++){
			if(arr[i]>arr[j]){
				min=j;
			}
		} 
		//經(jīng)過上面的里層for,就找到了最小的元素的下表
		swap(&arr[i],&arr[min]) ;
	} 
}
//插入排序
void insert_sort(int arr[],int n){
	int temp,j;
	for(int i=1;i<n;i++){
		temp=arr[i];
		for(j=i;j>0&&arr[j-1]>temp;j--){
			//后挪
			arr[j]=arr[j-1];
		}
		//現(xiàn)在就找到空出來的插入位置了
		arr[j]=temp; 
	}
} 
//希爾排序
void shell_sort(int arr[],int n){
	int in,i,j,temp;
	//本來這個排序是很好理解的,就是這個外層的循環(huán)
	//故弄玄虛,你就把他理解成一個簡單的,遞減的數(shù)組就行
	//而且這個2的指數(shù)遞減的序列的時間復雜度是很壞的 
	//最好使用SED或者HIB序列會好很多,這里只是演示 
	//兩個里層的for就是插入排序,仔細看看就能看懂 
	
	for(in=n/2;in>0;in=in/2){
		for(i=in;i<n;i++){
			temp=arr[i];
			for(j=i;j>=in;j=j-in){
				if(arr[j-in]>temp){
					//后挪 
					arr[j]=arr[j-in];
				}
				else{
					//arr[j-in]<temp,說明找到了 
					break;
				}
			}
			//上面執(zhí)行完,肯定找到了插入位置
			arr[j]=temp; 
		}
	} 
} 
//首先是下濾操作
//i是根,n是heap的規(guī)模 
//這里的下濾針對最大堆 
void perc_down(int arr[],int i,int n){
	int child,temp;
	//仔細想想,其實和插入排序差不多
	//首先把i取出來,把i在堆里面所在的位置空出來 
	//這里和原來建堆的下濾又不一樣,這里沒有設置哨兵 
	for(temp=arr[i];(2*i+1)<n;i=child){
		child=2*i+1;
		//如果當前兒子不是最后一個,說明還有右兒子
		//兩者取最大 
		if(child!=(n-1)&&arr[child]<arr[child+1]){
			child++;
		}
		if(temp<arr[child]){
			arr[i]=arr[child];
		}
		else{
			//當前取出來的值終于大于兩個兒子時。 
			break;
		}
		
	} 
	//上面輪完之后,肯定找到了一個兒子比我們取出來的值還要小的
	arr[i]=temp; 
} 
void heap_sort(int arr[],int n){
	int i;
	//建堆
	for(i=n/2;i>=0;i--){
		perc_down(arr,i,n);
	}
	//取最大值放在最后已經(jīng)舍棄的位置上,下濾剩下的堆
	for(i=n-1;i>0;i--){
		//取最大值放在最后已經(jīng)舍棄的位置上
		swap(&arr[0],&arr[i]);
		// 濾剩下的堆
		perc_down(arr,0,i);
	}
}
//歸并排序
//第一步,寫一個將兩個已經(jīng)排好序列的歸并
void merge(int arr[],int temp_arr[],int left_start,int right_start
			,int right_end)
{
	int i,temp_start,elem_num,left_end;
	temp_start=left_start;
	left_end=right_start-1;
	elem_num=right_end-left_start+1;
	//歸并的核心
	while(left_start<=left_end&&right_start<=right_end){
		if(arr[left_start]<=arr[right_start]){
			temp_arr[temp_start++]=arr[left_start++];
		}
		else{
			temp_arr[temp_start++]=arr[right_start++];
		}
	}	
	while(left_start<=left_end){
		temp_arr[temp_start++]=arr[left_start++];
	}		
	while(right_start<=right_end){
		temp_arr[temp_start++]=arr[right_start++];
	}
	//重新拷回去,記住,這里歸并的只是原來數(shù)組的一部分,所以不能從頭開始
	for(i=0;i<elem_num;i++,right_end--) {
		arr[right_end]=temp_arr[right_end];
	}
} 
//第二步,遞歸調用歸并,將數(shù)組不斷分割
void m_sort(int arr[],int temp_arr[],int left,int right){
	//tra_arr(arr,10);
	int center;
	//遞歸結束條件
	if(left<right){
		center=(right+left)/2;
		m_sort(arr,temp_arr,left,center);
		m_sort(arr,temp_arr,center+1,right);
		merge(arr,temp_arr,left,center+1,right);
	} 
} 
//第三步,初始化臨時數(shù)組
void merge_sort(int arr[],int n){
	int *temp_arr;
	temp_arr=(int*)malloc(n*sizeof(int));
	m_sort(arr,temp_arr,0,n-1);
	free(temp_arr);
} 

//快速排序
//首先,實現(xiàn)三數(shù)中值分割法,取一個“裁判” (中值) 
int get_pri(int arr[],int left,int right){
	int center=(left+right)/2;
	if(arr[left]>arr[center]){
		swap(&arr[left],&arr[center]);
	}
	if(arr[left]>arr[right]){
		swap(&arr[left],&arr[right]);
	}
	if(arr[center]>arr[right]){
		swap(&arr[center],&arr[right]);
	}
	//把中值扔到倒數(shù)第二個,因為上述操作已經(jīng)讓倒數(shù)第一大于中值了 
		swap(&arr[center],&arr[right-1]);
		
	return arr[right-1];
	
} 
//其次,實現(xiàn)分而治之
void q_sort(int arr[],int left,int right){
	int i,j,pri;
	//如果規(guī)模已經(jīng)小于三了,就不要再分而治之了,沒得分了 
	if(right-left>=3){
		//取中值
		pri= get_pri(arr,left,right);
		//取左右往中間靠攏的兩個指針i,j
		i=left;
		j=right-1;
		//開始判斷
		while(1){
			//如果當前i對應的值小于裁判,繼續(xù)推進 
			while(arr[++i]<pri);
			// 如果當前i對應的值大于裁判,繼續(xù)推進
			while(arr[--j]>pri);
			//上面走完,肯定碰到硬杈了,在i和j沒有錯位的情況下
			//交換
			if(i<j){
				swap(&arr[i],&arr[j]);
			} 
			else{
				break;
			}
		} 
		swap(&arr[i],&arr[right-1]);
		//這個i的作用遠不止此,這個i還記錄了上一個裁判的位置
		//開始對分下來的兩個部分進行同樣的操作
		q_sort(arr,left,i-1);
		q_sort(arr,i+1,right); 
	}
	//如果遞歸到規(guī)模已經(jīng)無法再分了
	//就用普通的方法排序
	else{
		/*這里稍微講一下
		數(shù)組和指針實際上是一樣的東西
		到這里了,那肯定就剩一個或者兩個元素了
		所以數(shù)組的開頭變成left所指的位置,現(xiàn)在left所在位置的下標
		就是0,所以后面的n也要相應變化*/ 
		insert_sort(arr+left,right-left+1);
	}
	
} 
//最后包裝一下
void quick_sort(int arr[],int n){
	q_sort(arr,0,n-1);
} 
//遍歷數(shù)組
void tra_arr(int arr[],int n){
	for(int i=0;i<n;i++){
		printf("%d  ",arr[i]);
	}
	printf("\n");
} 

以上就是C語言所有經(jīng)典排序方法的實現(xiàn)代碼的詳細內容,更多關于C語言排序方法的的資料請關注腳本之家其它相關文章!

相關文章

  • C語言小程序 如何判斷兩個日期之差

    C語言小程序 如何判斷兩個日期之差

    輸入兩個日期,計算之間相差多少天。 用了兩種方法實現(xiàn),第二種利用結構體,代碼比較清晰,其余的都一樣
    2013-07-07
  • c++中?isupper()和islower()函數(shù)詳解

    c++中?isupper()和islower()函數(shù)詳解

    在C++中,islower()和isupper()是C++標準庫中提供的兩個字符判斷函數(shù),這兩個函數(shù)用于判斷一個字符是否為小寫字母或大寫字母,這篇文章主要介紹了c++?isupper()?islower()的相關資料,需要的朋友可以參考下
    2024-05-05
  • 創(chuàng)建二叉樹 二叉樹如何刪除節(jié)點操作教程

    創(chuàng)建二叉樹 二叉樹如何刪除節(jié)點操作教程

    本文將詳細介紹二叉樹的創(chuàng)建,節(jié)點刪除,節(jié)點增加等一系列操作方法,需要的朋友可以參考下
    2012-12-12
  • C++中std::stringstream多類型數(shù)據(jù)拼接和提取用法小結

    C++中std::stringstream多類型數(shù)據(jù)拼接和提取用法小結

    本文主要介紹了C++中std::stringstream多類型數(shù)據(jù)拼接和提取用法小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • C指針原理教程之C快速入門

    C指針原理教程之C快速入門

    C語言作為大學編程或者計算機專業(yè)的一門必修課,把很多初學編程的小伙伴都難住了,感覺無從下手,今天呢,我們來簡單介紹下,如何快速入門C語言
    2019-02-02
  • C++?數(shù)據(jù)結構超詳細講解順序表

    C++?數(shù)據(jù)結構超詳細講解順序表

    程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要創(chuàng)建這種元素組,用變量記錄它們,傳進傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關系由它們的存儲順序自然表示
    2022-03-03
  • C++操作MySQL的實現(xiàn)示例

    C++操作MySQL的實現(xiàn)示例

    這篇文章主要介紹了C++操作MySQL的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • 深入理解strcpy與memcpy的區(qū)別

    深入理解strcpy與memcpy的區(qū)別

    本篇文章是對strcpy與memcpy的區(qū)別進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Qt計時器使用方法詳解

    Qt計時器使用方法詳解

    這篇文章為大家詳細主要介紹了Qt計時器的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++?計算時間差的五種方法小結

    C++?計算時間差的五種方法小結

    本文主要介紹了C++?計算時間差的五種方法小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04

最新評論

湄潭县| 泽州县| 长治市| 萝北县| 怀仁县| 会泽县| 临猗县| 北票市| 五家渠市| 瑞昌市| 乌海市| 宽甸| 仁化县| 莱西市| 湖州市| 安化县| 永丰县| 洪雅县| 香格里拉县| 故城县| 东宁县| 卫辉市| 安宁市| 县级市| 塔城市| 昭通市| 江达县| 白山市| 镇宁| 乐都县| 荔波县| 罗定市| 新宾| 黄平县| 崇左市| 孟津县| 习水县| 枞阳县| 昭觉县| 宁强县| 北海市|