插入排序:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置中
- 重复步骤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;
}
}
}
}