博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基础排序算法,java实现(快速,冒泡,选择,堆排序,插入)
阅读量:6253 次
发布时间:2019-06-22

本文共 5763 字,大约阅读时间需要 19 分钟。

 

1.冒泡排序:

      (1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  (2)外面再套个循环就行。

       算法复杂度:O(N2)   不罗嗦,上代码:

//冒泡排序(两两交换,外加一个外循环)	public static void bubbleSort(int sortData[]){		int i,j,temp;		int len = sortData.length;		for (i=0;i
sortData[j]){ swap(sortData,j-1,j); } } } }

  

2. 选择排序

    (1)每次从剩下无序中选择最小的元素,进行交换

        算法复杂度:O(N2)   不罗嗦,上代码:        

//选择排序(从剩下的选最大的交换)    public static void selectionSort(int sortData[]){        int i,j,min,index,temp;        int len = sortData.length;        for (i=0;i

 

3.插入排序:

      (1)基本操作就是将一个数据插入到已经排好序的有序数据中:

             

//插入排序,把大的往后移动	public static void insertSort(int sortData[]){		int i,j,temp;		int len = sortData.length;		for (i=1;i
=0 && temp < sortData[j];j--){ sortData[j+1] = sortData[j]; } sortData[j+1] = temp; } }

  

3.希尔排序:

      是插入排序的改进版,主要是希尔通过引入增量,加强了插入排序的威力。随着增量的减少,就有序了。

     

//希尔排序    public static void shellSort(int sortData[]){        int i,j,temp;        int len = sortData.length;        int gap = len/2;        while(gap>=1){            for (i=gap;i
=0&&temp

 

4.堆排序

      (1)初始堆  (2)adjust到最小堆或最大堆的格式 (3)排序,根位置和最后一个位置换一下位置,再adjust。

    利用最大堆,最小堆这一特性,使得每次从无序的列表中选择最大或者最小的数据。    

    其基本思想为(大顶堆):

    1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无序区;

    2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n]; 

    3)由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,......Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2....Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

  1)运行时间消耗:构建初始堆 和 重建堆的反复筛选上。

         构建堆:

           每次从最下层的最右边的非终端节点构建,将他和期孩子节点进行比较,每次最多进行两次比较和交互,因此这个构建时间是N

         重建堆(排序):

             第i次取堆顶需要logi,那么要去n-1次,所以时间复杂度是nlogn      

       由于堆排序对原始记录的排序状态并不敏感,因此它无论是最好、最坏和平均时间复杂度均为O(nlogn)。

    2) 空间复杂度上,它只有一个用来交换的暂存单元,也算是非常的不错。不过由于记录的比较与交换是跳跃式进行,因此堆排序也是一种不稳定的排序方法。

        另外,由于初始构建堆所需的比较次数较多,因此,它并不适合待排序序列个数较少的情况。 

        

public static void heapSort(int sortData []){		buildMaxHeap(sortData);		for(int i=sortData.length-1;i>=1;i--){			swap(sortData,0,i);			maxHeap(sortData,i,0);		}	}		public static void buildMaxHeap(int sortData[]){			int half = sortData.length/2;			for(int i=half;i>=0;i--){				maxHeap(sortData,sortData.length,i);			}	}		public static void maxHeap(int sortData[],int heapSize,int index){		int left = 2*index+1;		int right = 2*index+2;		int largest = index;				if (left < heapSize && sortData[left]>sortData[index]){			largest = left;		}		if(right < heapSize && sortData[right]>sortData[largest]){			largest = right;		}		if (index != largest){			swap(sortData,index,largest);			maxHeap(sortData,heapSize,largest);		}		}

  5.  快速排序:

      其实是二分法,一般来说以第一个位置做为分界点,把小的放到这个分界点前面,大的放到后面。递归这两部分。

      基本思想:选择一个基准元素,通常是选取第一个或者最后一个元素,通过一趟扫描,将待排序的序列分成两部分,一部分比基准元素小,一部分比基准元素大。此时基准元素就在排好序的正确位置。然后采用相同的方法,递归排序划分左右数据。

      算法复杂度:平均和最好都是: nlog(n)  最坏情况(逆序): n2         不稳定

     

//快速排序	public static void quickSort(int sortData[],int start,int end){		if	(start >=end) return;		int i=start,j=end,value = sortData[i];		boolean flag = true;		while(i!=j){			if (flag){				if (value > sortData[j]){					swap(sortData,i,j);					flag=false;				}else{					j--;				}			}else{				if (value

c++

//快排void qsort(int a[],int low,int high){	if (low >= high) return;	int first = low;	int last = high;	int key = a[first];	while(first
=key) --last; a[first] = a[last]; while(first

  

  

 

6  归并排序  c++

void merge(int array[],int low,int mid,int high){	int i = low;	int j = mid+1;	int k = 0;	int *array2 = new int [high-low+1];	while(i <= mid && j <= high){		if (array[i] < array[j]){			array2[k] = array[i];			i++;			k++;		}else{			array2[k] = array[j];			j++;			k++;		}	}	while(i <= mid){		array2[k] = array[i];		k++;		i++;	}	while(j <= high){		array2[k] = array[j];		k++;		j++;	}	for(k=0,i=low;i<=high;i++,k++){		array[i] = array2[k];	}}void mergeSort(int a[],int low,int high){	if (low

  

 

 

 

   所有可运行代码:

    

//gjspublic class sort {    public static void printValue(int sortData[]){        for (int i = 0;i
sortData[j]){ swap(sortData,j-1,j); } } } } //选择排序(从剩下的选最大的交换) public static void selectionSort(int sortData[]){ int i,j,min,index,temp; int len = sortData.length; for (i=0;i
=0 && temp < sortData[j];j--){ sortData[j+1] = sortData[j]; } sortData[j+1] = temp; } } //希尔排序 public static void shellSort(int sortData[]){ int i,j,temp; int len = sortData.length; int gap = len/2; while(gap>=1){ for (i=gap;i
=0&&temp
=1;i--){ swap(sortData,0,i); maxHeap(sortData,i,0); } } public static void buildMaxHeap(int sortData[]){ int half = sortData.length/2; for(int i=half;i>=0;i--){ maxHeap(sortData,sortData.length,i); } } public static void maxHeap(int sortData[],int heapSize,int index){ int left = 2*index+1; int right = 2*index+2; int largest = index; if (left < heapSize && sortData[left]>sortData[index]){ largest = left; } if(right < heapSize && sortData[right]>sortData[index]){ largest = right; } if (index != largest){ swap(sortData,index,largest); maxHeap(sortData,heapSize,largest); } } //快速排序 public static void quickSort(int sortData[],int start,int end){ if (start >=end) return; int i=start,j=end,value = sortData[i]; boolean flag = true; while(i!=j){ if (flag){ if (value > sortData[j]){ swap(sortData,i,j); flag=false; }else{ j--; } }else{ if (value

 

   

 

转载于:https://www.cnblogs.com/GuoJiaSheng/p/5250704.html

你可能感兴趣的文章
算法分析-快速排序QUICK-SORT
查看>>
Web服务基础六之编译安装配置RHEL+Apache+MySQL+PHP+ZendOptimize
查看>>
log4net 使用
查看>>
通过bat文件运行jar包程序
查看>>
关于hive RegexSerDe的源码分析
查看>>
V$INSTANCE视图
查看>>
OpenCart之侧边浮动联系我们表单(Side Contact Us Form)
查看>>
PureWhite OpenCart 商城自适应主题模板 ABC-0009
查看>>
docker整理文档
查看>>
zabbix安装配置
查看>>
Awk练习笔记
查看>>
RAID级别详解,如何在Linux下实现软RAID图文解析。
查看>>
CentOS 配置***客户端
查看>>
线上应用故障排查之二:高内存占用
查看>>
书写「简历」时,需要规避的错误
查看>>
我的友情链接
查看>>
老毛桃 win7
查看>>
continue
查看>>
myeclise10安装svn的方法
查看>>
第四次作业
查看>>