import java.io.InputStreamReader;
import java.io.BufferedReader;
/**
* Class SortDemo
* Description 简单排序有insertSort,BubbleSort,SelectSort,ObjectSort
* 复杂排序 shellSort,quickSort,baseSort
* Company opendata
* Author Chenlly
* Date 08-11-30
* Version 1.0
*/
public class SortDemo{
private int[] intArray;
//构造方法
public SortDemo(){
intArray=new int[]{1000,10,65,23,887,28,97,65,43,2,7,9,188};
}
//显示排序后的数据
public void display(){
for(int i=0;i<intArray.length;i++){
System.out.print(intArray[i]+",");
}
}
//交换数据
public void swap(int i,int j){
int temp=0;
temp=intArray[j];
intArray[j]=intArray[i];
intArray[i]=temp;
}
//(1)插入排序,对intArray[i]插入到左边intArray[0,i]局部有序的数组中适当的位置,使之
//intArray[0,i+1]继续有序列
public void insertSort(){
for(int i=1;i<intArray.length;i++){
int temp=intArray[i];//暂存临时变量
int j=i;
while(temp<intArray[j-1]){
intArray[j]=intArray[j-1];//移动
j--;
if(j==0)break;
}
intArray[j]=temp;//temp已经找到正确的位置,插入。
}
}
//(2)冒泡排序,最小的元素冒出来,相邻两数据比较
public void bubbleSort(){
for(int i=0;i<intArray.length;i++){
for(int j=intArray.length-1;j>i;j--){
if(intArray[j]<intArray[j-1]){
swap(j,j-1);
}
for(int k=0;k<intArray.length;k++){
System.out.print(intArray[k]+",");
}
System.out.println();
}
}
}
//(3)选择排序,对冒泡排序的改进,交换次数减少但总的比较时间还是O(N2)
//在右边无序数组中intArray[j,n]选择一个最小的元素,然后和右边无序的第一个元素intArray[j]交换,
//使得左边intArray[0,j+1]有序
public void selectSort(){
for(int i=0;i<intArray.length;i++){ int min = i;
for(int j=i+1;j<intArray.length;j++){
if(intArray[min]>intArray[j]){
swap(min,j);
}
}
}
}
//(4)希尔排序对插入排序的改进 间隔序列 h=h*3+1
//间隔序列内做插入排序,直到最后h等于1此时是普通的插入排序
public void shellSort(){
int h=1;
while(h>0){
h=h*3+1;
}
for(int i=h;i<intArray.length;i++){
int j=i;
int temp=intArray[i];
while(j>h-1&&temp>intArray[j-h]){
intArray[j]=intArray[j-h];
j=j-h;
}
//找到合适的位置
intArray[j]=temp;
}//end for
h=(h-1)/3;
}
//(5)快速排序对冒泡排序的改进,对一个值快速定位,使左边的值都比它小,右边的值都比它大
/*
首先你的脑子里先浮现一个数组和三个指针,第一个指针称为p指针,
在整个过程结束之前它牢牢的指向第一个数,第二个指针和第三个指针分别为lo指针和hi指针,
分别指向最左边的值和最右边的值。lo指针和hi指针从两边同时向中间逼近,
在逼近的过程中不停的与p指针的值比较,如果lo指针的值比p指针的值小,lo++,还小还++,再小再++,
直到碰到一个大于p指针的值,这时视线转移到hi指针,如果 hi指针的值比p指针的值大,hi--,还大还--,
再大再--,直到碰到一个小于p指针的值。这时就把lo指针的值和hi指针的值做一个调换。
持续这过程直到两个指针碰面,这时把p指针的值和碰面的值做一个调换,然后返回p指针新的位置。
*/
//O(N*logN)
public void quickSort(){
reQuickSort(0,intArray.length-1);
}
public void reQuickSort(int left,int right){
if(right<=left){
return;//return用在此处仅仅做为一个方法的结束
}else{
int pivot=intArray[right];//枢纽,每次把最右边的元素作为枢纽
int midIndex=partition(left,right,pivot);//枢纽对于的恰当的位置
reQuickSort(left,midIndex-1);
reQuickSort(midIndex+1,right);
}
}
public int partition(int left,int right,int pivot){
int vleft=left;
int vright=right-1;
while(true){
//持续比较直到左边某个的值大于枢纽
while(intArray[vleft]<intArray[pivot]){
vleft++;
}
//持续比较直到右边某个值小于枢纽
while(intArray[pivot]<intArray[vright]){
vright--;
}
//比较结束,交换枢纽和intArray[vleft]值
if(vright<vleft){
break;
}else{
//如果最终比较还没结束需交换刚才停止的两个值
swap(vleft,vright);
}
}//end while(true)
swap(vleft,right);
return vleft;
}
//(6)基数排序
public void baseSort(){
}
//主调函数
public static void main(String args[]){
SortDemo sd=new SortDemo();
System.out.println("请简单选择排序算法:");
System.out.println("1 插入排序");
System.out.println("2 冒泡排序");
System.out.println("3 选择排序");
System.out.println("请高级选择排序算法:");
System.out.println("4 希尔排序");
System.out.println("5 快速排序");
System.out.println("6 基数排序");
System.out.println("请输入编号");;
String str="";
try{
InputStreamReader ir=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(ir);
str=br.readLine();
}catch(Exception ex){
ex.printStackTrace();
}
int op=Integer.parseInt(str);
switch(op){
case 1: sd.insertSort();break;
case 2: sd.bubbleSort();break;
case 3: sd.selectSort();break;
case 4: sd.shellSort();break;
case 5: sd.quickSort();break;
case 6: sd.baseSort();break;
default: break;
}
sd.display();
}
}
排序-基本排序算法
原创
©著作权归作者所有:来自51CTO博客作者wx63086371c7e9c的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
排序算法之计数排序的优化
排序算法之计数排序的优化
数组 计数排序 最小值 -
【C】排序算法
文章介绍了几种常用的排序,包括其实现思路与具体代码实现。
排序 算法 代码分析 -
基本的排序算法
一些简单的排序算法
算法 排序 -
基本排序算法总结
Java各种排序总结
System java 数组 -
Java排序算法之基本选择排序
本章介绍Java经典排序算法中的冒泡排序,欢迎各位同学,
算法 选择排序 数组 简单选择排序 待排序 -
Java 常见的排序算法 java基本排序算法
在开发过程中使用得比较多的算法就是排序算法和查找算法了,今天先盘点一下常见的排序算法中的两个大类交换排序和插入排序。 Java 交换排序快速排序基本思想:用选取的初始值(一般是第一个)将待排序序列分为小于初始值和大于初始值的两部分,然后重复此操作,最终到排序完成。该算法是一个不稳定的算法(如果待排序序列中存在相同的元素,经过排序后他们的相对位置不发生改变那么这个算法就是稳定的排序算法)空间
Java 常见的排序算法 java 排序 java 插入排序 java 算法 java实现apriori算法