1. 程式人生 > >常用排序演算法程式碼測試

常用排序演算法程式碼測試

#include <stdio.h>
#define N 10  //測試陣列長度
//交換變數值
void swap(int *a,int *b)
{
	
	int t;
	t=*a;
	*a=*b;
	*b=t;
}
//列印一次排序結果
void printResult(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
	 printf("%d ",a[i]);
	 printf("\n");
}
//直接插入排序
void InsertSort(int L[],int length)
{
	int i,j;
	for(i=1;i<length;i++){
		j=i;
		if(L[j]<L[i-1]){
			int temp=L[j];
			while(temp<L[j-1]&&j!=0){
				L[j]=L[j-1];
				j--;
			}
			L[j]=temp;
		}
		printResult(L,length);
	}
}
//氣泡排序
void BubbleSort(int L[],int length)
{
	int i,j;
	for(i=0;i<length-1;i++){
		for(j=1;j<length;j++)
		 if(L[j]<L[j-1]) 
		 {
			 swap(L+j,L+j-1);
		 }
		 printResult(L,length);
	}
}
//選擇排序
void SelectSort(int L[],int length)
{
	int i,j,t;
	for(i=0;i<length;i++){
		t=i;
		for(j=i+1;j<length;j++){
			if(L[j]<L[t]) t=j;
		}
		if(t!=i){
			swap(L+i,L+t);
		}
		printResult(L,length);
	}

}

void Shell(int L[],int d)
{	
	int i,j,t;
	int temp;
	for(i=d;i<N;i++){
		if(L[i]<L[i-d]){		
			temp=L[i];			
			j=i;
			while(j-d>=0&&temp<L[j-d]){
				L[j]=L[j-d];
				j-=d;
			}
			L[j]=temp;
		}
			printResult(L,N);
	}
}
//希爾排序
void ShellSort(int L[],int d)
{
	while(d>=1){
		printf("d=%d\n",d);
		Shell(L,d);
		d/=2;
	}
	
}

void Merge(int L[],int head,int mid,int tail)
{
	int T[N]={0};
	int i=0,j=mid+1,k=0;
	while((head+i)<=mid&&j<=tail){
		if(L[head+i]<L[j]){			
			T[k++]=L[head+i];
			i++;
		}else{
			T[k++]=L[j++];
		}
	}
	while((head+i)<=mid){
		T[k++]=L[head+i];
		i++;
	}
	while(j<=tail)T[k++]=L[j++];
	for(i=0;i<k;i++)L[head+i]=T[i];
	printResult(L,N);
}
//歸併排序
void MergeSort(int L[],int head,int tail)
{
	int mid=0;
	if(head<tail){
		mid=(head+tail)/2;
		MergeSort(L,head,mid);
		MergeSort(L,mid+1,tail);
		Merge(L,head,mid,tail);
	}
}

int Partition(int L[],int low,int high)
{
	int pivot=L[low];
	int temp;
	while(low<high){
	while(low<high && L[high]>=pivot){
		high--;
	}
	swap(&L[low],&L[high]);
	while(low<high && L[low]<=pivot){
		low++;
	}
	swap(&L[low],&L[high]);
    }
    printResult(L,N);
    return low;
}
//快速排序
void QuickSort(int L[],int low,int high)
{
	if(low<high){
		int head=low;
		int tail=high;
		int n=Partition(L,head,tail);
		QuickSort(L,low,n);
		QuickSort(L,n+1,high);
	}

}

void HeapAdjust(int *a,int i,int size)
{	
	int max=i;
	int lchild=2*i+1,rchild=2*i+2;
	if(i<(size-1)/2){
		if(lchild<size && a[lchild]>a[max]){
			max=lchild;
		}
		if(rchild<size && a[rchild]>a[max]){
			max=rchild;
		}
		if(i!=max){
			swap(a+i,a+max);
			HeapAdjust(a,max,size);
		}
	}
}
void BuildHeap(int *a,int size)
{
	int i;
	for(i=size/2-1;i>=0;i--){
		HeapAdjust(a,i,size);
	}
}
//堆排序
void HeapSort(int *a,int size)
{
	int i;
	BuildHeap(a,size);
	for(i=size-1;i>=0;i--){
		swap(a,a+i);
		HeapAdjust(a,0,i-1);
		printResult(a,size);
	}
}		

void main()
{
	int a[10]={5,9,2,6,5,2,4,10,8,3};
	//InsertSort(a,10);
	//BubbleSort(a,10);
	//SelectSort(a,10);
	//ShellSort(a,3);
	//MergeSort(a,0,9);
	//QuickSort(a,0,9);
    HeapSort(a,10);
    
}
	 
以上列舉了幾種常見排序演算法的實現方式,僅供參考,程式碼均測試無誤。

相關推薦

常用排序演算法程式碼測試

#include <stdio.h> #define N 10 //測試陣列長度 //交換變數值 void swap(int *a,int *b) { int t; t=*a; *a=*b; *b=t; } //列印一次排序結果 void prin

常用排序演算法java程式碼實現---快速排序,氣泡排序,選擇排序

快速排序 public class QuickSort { public void qSort(int[] arr,int left,int right) { if(left>right) { return ; } int i = le

幾大常用排序演算法編寫及正確性、效率測試

排序演算法寫了幾遍,總是過段時間就忘,故在此彙總下。 寫排序演算法重要的是理解它的原理,找到如何遍歷及遍歷和終止的條件 插入排序 從左建立有序區,將右側的值依次插入該有序區,有序區中從插入的位置開始依次後移一位;從左往右遍歷 void InsertSor

Java 常用排序演算法總結

氣泡排序:  /*冒泡演算法*/ public class BubbleSort { public static void bubble_sort(int[] arr){ int temp; for(int i = 0; i < arr

常用排序演算法的時間複雜度和空間複雜度及特點

一、常用排序演算法的時間複雜度和空間複雜度表格 二、特點 1.歸併排序: (1)n大時好,歸併比較佔用記憶體,記憶體隨n的增大而增大,但卻是效率高且穩定的排序演算法。 (2)歸併排序每次遞迴都要用到一個輔助表,長度與待排序的表長度相同,雖然遞迴次數是O(log2n),但每次

氣泡排序、選擇排序、插入排序、快速排序演算法耗時測試

import java.util.*; public class Test1 { public static void main(String[] args) throws Exception{ int[] arr1=new int[20000]; for(int i=0;i&l

Java種八種常用排序演算法

目錄: 1.直接插入排序 2.希爾排序 3.簡單選擇排序 4.堆排序 5.氣泡排序 6.快速排序 7.歸併排序 8.基數排序   1. 直接插入排序 經常碰到這樣一類排序問題:把新的資料插入到已經排好的資料列中。 將第一個數和第二個數排序,然後構成一個有序序列 將第三個數插

c語言實現常用排序演算法

#include <stdio.h> #include <stdlib.h> #define arrLen(arr) sizeof(arr)/sizeof(arr[0]) void print(int arr[], int len) { int i = 0; fo

資料結構與演算法常用排序演算法總結

排序演算法穩定性的簡單形式化定義為:如果Ai = Aj,排序前Ai在Aj之前,排序後Ai還在Aj之前,則稱這種排序演算法是穩定的。通俗地講就是保證排序前後兩個相等的數的相對順序不變。   對於不穩定的排序演算法,只要舉出一個例項,即可說明它的不穩定性;而對於穩定的排序演算法,必須對演算

常用排序演算法中的時間複雜度和空間複雜度

排序法 最差時間分析 平均時間複雜度 穩定度 空間複雜度 氣泡排序 O(n2) O(n2) 穩定 O(1) 快速排序 O(n2) O(n*log2n) 不穩定 O(log2n)~O(n) 選擇排序 O(n2) O(n2) 不穩定

八種常用排序演算法(Java)

01演算法分類 02時間複雜度 03相關概念 穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面。 不穩定:如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面。 時間複雜度:對排序資料的總的操作次數。反映當n變化時,操作次數呈現什麼規律。

機器學習——常用排序演算法總結

我們通常所說的排序演算法往往指的是內部排序演算法,即資料記錄在記憶體中進行排序。排序演算法大體可分為兩種: 一種是比較排序,時間複雜度O(nlogn) ~ O(n^2),主要有:氣泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等。 另一種是非比較排序,時間複雜度可以達到O(

幾種常用排序演算法的思路和複雜度對比

1、插入排序——直接插入排序、希爾排序 (1)直接插入排序思路:從第1號元素開始,每個元素依次與前面的元素做比較,小的排前面,這樣當比較到最後一 個元 素完即完成排序。 (2)希爾排序思路:     

常用排序演算法C++實現

#ifndef SORT_H #define SORT_H class Sort { private: Sort(); Sort(const Sort&); Sort& operator = (const Sort&); te

常用排序演算法

常用演算法總結 最近為了面試,在惡補演算法的一些知識,算是嚐到了大學沒有好好學習苦頭,博文是轉載的,我為了加深一些映像就自己寫一篇,順便加了一些自己的理解,有錯誤的話希望各位能夠指正。 排序演算法大體可分為兩種: 一種是比較排序,時間複雜度O(nlogn) ~

常用HASH演算法 程式碼 & 比較

其中資料1為100000個字母和數字組成的隨機串雜湊衝突個數。資料2為100000個有意義的英文句子雜湊衝突個數。資料3為資料1的雜湊值與1000003(大素數)求模後儲存到線性表中衝突的個數。資料4為資料1的雜湊值與10000019(更大素數)求模後儲存到線性表中衝突的個數。 經過比較,得出以上平均得分。

java實現常用排序演算法

陣列排序問題是java工程師面試過程中很常見的問題之一,也是java程式設計師必備的知識。本文總結了用java實現常用的排序演算法。 注:陣列從小到大排序 1. 氣泡排序 特點:效率低,實現簡單,容易理解 思想:每一次遍歷,將待排序中最大的元素移到最後,剩下的為新的待

JavaScript常用排序演算法總結

(一)氣泡排序 原理:          比較相鄰的元素,如果第一個比第二個大,就交換他們兩個;          對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對;          在這一點,最後的元素應該會是最大的數;          針對所有的元素重複

常用排序演算法:直接選擇排序

直接選擇排序演算法思路: 第 1 趟,在待排序記錄 r1 ~ r[n]中選出最小的記錄,將它與 r1 交換;第 2 趟, 在待排序記錄 r2 ~ r[n]中選出最小的記錄,將它與 r2 交換;以此類推,第 i 趟在待排序 記錄 r[i] ~ r[n]中選出最小的記錄,將它與

C語言中常用排序演算法(氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序)實現比較

以下程式在win10 X64位作業系統,使用VS2017執行驗證可行 排序是非常重要且很常用的一種操作,有氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序等多種方法。 例項1 冒泡法排序 1.前言: 陣列中有N個整數,用冒泡法將它們從小到大(或從大到小)排序。冒泡法