zoukankan      html  css  js  c++  java
  • 算法笔记-排序算法

    基于比较的排序

    O(n^2)

    冒泡排序

    // 冒泡排序
    void bubble(int A[],int len) {
    	for(int i=0; i<len-1; i++) {
    		bool flag = false; //// 提前退出冒泡循环的标志位
    		for(int j=0; j<len-i-1; j++) {
    			if(A[j]>A[j+1]) {
    				swap(A[j],A[j+1]);
    				flag = true;
    			}
    		}
    		if(!flag)break;
    	}
    }
    

    插入排序

    // 插入排序
    void insert(int A[],int len) {
    	for(int i=1; i<len; i++) {
    		int temp = A[i];
    		int j=i-1;
    		for(; j>=0; j--) {
    			if(A[j]>temp) A[j+1]=A[j];
    			else break;
    		}
    		A[j+1]=temp;
    		show(A,len);
    	}
    }
    

    选择排序

    // 选择排序
    void select(int A[],int len) {
    	for(int i=0; i<len; i++) {
    		int mini=i;
    		for(int j=i;j<len;j++){
    			if(A[j]<A[mini]){
    				mini=j;
    			}
    		}
    		swap(A[i],A[mini]);
    	}
    }
    

    O(nlogn)

    归并排序

    #include <iostream>
    using namespace std;
    // 归并函数 
    void merge(int A[],int p,int m,int r) {
    	int i=p,j=m+1,k=0;
    	int temp[r-p+1]= {0};
    	while(i<=m&&j<=r) {
    		if(A[i]<=A[j])temp[k++]=A[i++];
    		else temp[k++]=A[j++];
    	}
    	while(i<=m)temp[k++]=A[i++];
    	while(j<=r)temp[k++]=A[j++];
    	memcpy(A+p,temp,sizeof(int)*(r-p+1));
    }
    // 归并排序 
    void merge_sort_c(int A[],int p, int r) {
    	if(p>=r)return;
    	//中点
    	int q = (p+r)>>1;
    	//分治递归
    	merge_sort_c(A,p,q);
    	merge_sort_c(A,q+1,r);
    	merge(A,p,q,r);
    }
    void merge_sort(int A[],int len) {
    	merge_sort_c(A,0,len-1);
    }
    void show(int A[],int len) {
    	for(int i=0; i<len; i++) {
    		printf("%d ",A[i]);
    	}
    	printf("
    ");
    }
    int main(int argc,char * argv[]) {
    	int A[10]= {3,4,2,2,1,9,8,7,5,6};
    	show(A,10);
    	merge_sort(A,10);
    	show(A,10);
    	return 0;
    }
    

    快速排序

    #include <iostream>
    using namespace std;
    
    // 分区函数 
    int partition(int A[],int p, int q) {
    	int pivot = A[q]; //分区点 
    	int i=p,j=p;
    	while(j<q) {
    		if(A[j]<=pivot) {
    			swap(A[i++],A[j]);
    		}
    		j++;
    	}
    	swap(A[i],A[j]); 
    	return i;
    }
    //快排 
    void quick_sort_c(int A[],int p, int q) {
    	if(p>=q)return;
    	int r = partition(A,p,q);
    	quick_sort_c(A,p,r-1);
    	quick_sort_c(A,r+1,q);
    }
    void quick_sort(int A[],int len) {
    	quick_sort_c(A,0,len-1);
    }
    void show(int A[],int len) {
    	for(int i=0; i<len; i++) {
    		printf("%d ",A[i]);
    	}
    	printf("
    ");
    }
    int main(int argc,char * argv[]) {
    	int A[10]= {3,4,2,2,1,9,8,7,5,6};
    	show(A,10);
    	quick_sort(A,10);
    	show(A,10);
    	return 0;
    }
    
  • 相关阅读:
    rhel5.4 x64安装apache http server2.2.27,并创建自动启服务
    解决BEA-000438 Unable to load performance pack.
    为aix系统挂载iso镜像-命令
    IBM小型机创建RAID
    linux下使用parted工具划分大于2T的分区
    linux下的SElinux
    日立HDS AMS2100存储的调试
    rhel创建yum源
    rfid安全简介
    安卓模拟器抓包
  • 原文地址:https://www.cnblogs.com/houzm/p/13357700.html
Copyright © 2011-2022 走看看