基础排序算法,java实现(快速,冒泡,选择,堆排序,插入)

Posted GJS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础排序算法,java实现(快速,冒泡,选择,堆排序,插入)相关的知识,希望对你有一定的参考价值。

 

1.冒泡排序:

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

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

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

	//冒泡排序(两两交换,外加一个外循环)
	public static void bubbleSort(int sortData[]){
		int i,j,temp;
		int len = sortData.length;
		for (i=0;i<len-1;i++){
			for (j=1;j<len-i;j++){
					if (sortData[j-1] > 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<len;i++){
            min = sortData[i];
            index = i;
            for (j=i+1;j<len;j++){
                if (sortData[j] < min){
                    min = sortData[j];
                    index = j;
                }
            }
            swap(sortData,i,index);
        }
    }

 

3.插入排序:

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

             

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

 

4.堆排序

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

        

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[index]){
			largest = right;
		}
		if (index != largest){
			swap(sortData,index,largest);
			maxHeap(sortData,heapSize,largest);
		}
	
	}

  5.  快速排序:

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

     

	//快速排序
	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<sortData[i]){
					swap(sortData,i,j);
					flag=true;
				}else{
					i++;
				}
			}
		}
		//printValue(sortData);
		quickSort(sortData,start,j-1);
		quickSort(sortData,i+1,end);
	}

  

   所有可运行代码:

    

//gjs
public class sort {

    public static void printValue(int sortData[]){
        for (int i = 0;i<sortData.length;i++){
            System.out.print(sortData[i]+" ");
        }
        System.out.println();
    }
    
    public static void swap(int [] data ,int pos1, int pos2){
        int temp = data[pos1];
        data[pos1] = data[pos2];
        data[pos2] = temp;
    }
    //冒泡排序(两两交换,外加一个外循环)
    public static void bubbleSort(int sortData[]){
        int i,j,temp;
        int len = sortData.length;
        for (i=0;i<len-1;i++){
            for (j=1;j<len-i;j++){
                    if (sortData[j-1] > 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<len;i++){
            min = sortData[i];
            index = i;
            for (j=i+1;j<len;j++){
                if (sortData[j] < min){
                    min = sortData[j];
                    index = j;
                }
            }
            swap(sortData,i,index);
        }
    }
    
    //插入排序,把大的往后移动
    public static void insertSort(int sortData[]){
        int i,j,temp;
        int len = sortData.length;
        for (i=1;i<len;i++){
            temp = sortData[i];
            for (j = i-1;j>=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<len;i++){
                temp = sortData[i];
                for (j=i-gap;j>=0&&temp<sortData[j];j=j-gap){
                    sortData[j+gap] = sortData[j];
                }
                sortData[j+gap] = temp;
            }
            gap = gap/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[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<sortData[i]){
                    swap(sortData,i,j);
                    flag=true;
                }else{
                    i++;
                }
            }
        }
        //printValue(sortData);
        quickSort(sortData,start,j-1);
        quickSort(sortData,i+1,end);
    }
    
    public static void main(String[] args) {
        int [] a={2,4,1,5,8,9,43,3,7,8,9,0,3};
        printValue(a);
        //bubbleSort(a);
        //selectionSort(a);
        //insertSort(a);
        //heapSort(a);
        //shellSort(a);
        quickSort(a,0,a.length-1);
        printValue(a);
        

    }

}

 

   

 

以上是关于基础排序算法,java实现(快速,冒泡,选择,堆排序,插入)的主要内容,如果未能解决你的问题,请参考以下文章

七大排序算法(插排,希尔,选择排序,堆排,冒泡,快排,归并)--图文详解

八大排序算法C语言过程图解+代码实现(插入,希尔,选择,堆排,冒泡,快排,归并,计数)

常见排序算法基本原理及实现(快排,归并,堆排,直接插入.....)

常见排序算法基本原理及实现(快排,归并,堆排,直接插入.....)

常见排序算法基本原理及实现(快排,归并,堆排,直接插入.....)

常用排序算法及Java实现