各种排序

插入排序:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置中
  6. 重复步骤2

 

void InsertSort(char array[],unsigned int n)
 {
    int i,j;
    int temp;
    for(i=1;i<n;i++)
    {
      temp = array[i];//store the original sorted array in temp
      for(j=i ; j>0 && temp < array[j-1] ; j--)
      {
          array[j]=array[j-1];
      }
      array[j]=temp;
    }
 }
 

 

堆排序:

先将所给数据构造成一棵树,然后将此树调整为“大顶堆”(或小顶堆)(从叶子节点往根节点调整)。然后选得一个关键字为最大的记录,然后与序列中最后一个记录交换,之后继续对序列中前 n-1 记录进行“筛选”,重新将它调整为一个“大顶堆”再将堆顶记录和第 n-1 个记录交换,如此反复直至排序结束

 

快速排序:

将第一个数先保存到临时变量里,然后以它为基准并占用它的位置

public  static void quick(int[] date,int start,int  end){
		if(start<end){
		int k = paixu(date,start,end);
		quick(date,start,k-1);
		quick(date,k+1,end);
		}
	}
	
	public static int paixu(int[] date,int start,int  end){
		int k;
		int temp=date[start];
		while(start<end){
			while(start<end&&temp<=date[end]){
				end--;
			}
			date[start]=date[end];
			while(start<end&&temp>=date[start]){
				start++;
			}
			date[end]=date[start];
		}
		k = start;
		date[start]=temp;
		return k;
	}
 

 

冒泡排序:

可以加标志位进行优化

public static void maopao(int date[]){
		for(int i=0;i<date.length;i++){//需要进行多少趟
			for(int j=1; j<date.length-i;j++){//每趟都从第0个和第1开始比较
				if(date[j]<date[j-1]){
					swap(date,j,j-1);
				}
			}
		}
	}
 

 

希尔排序:

将记录序列分成若干子序列,每个子序列分别进行插入排序。因为其减少了复制的次数,所以比直接插入排序要快许多。 当N值很大时数据项每一趟排序需要的个数很少,但数据项的距离很长。 当N值减小时每一趟需要和动的数据增多,此时已经接近于它们排序后的最终位置。(关键字较小的记录不是一步一步向前,而是跳跃式的向前)

	public static void shell(int[] date ){
		int step = date.length;
		int temp = 0;
		while((step = step/2)>0){
			//对步长step进行排序
			for(int i=step;i<date.length;i++){
				
				if(date[i]<date[i-step]){//需要交换
					temp = date[i];
					System.out.println("step"+temp);
					int j;
					for(j=i;j>0&&temp<date[j-step];j=j-step){
						date[j]=date[j-step];
					}
					
					date[j] = temp;
				}
			}
		}
	}

你可能感兴趣的:(排序)