简单排序算法的总结


    在数据结构中,感觉排序是个挺有趣的地方,现在来说说其中的简单排序:冒泡排序, 简单选择排序,直接插入排序。
    冒泡排序:不知道你的C 是怎么入门的,反正我是学的老谭的书过来的,一开始还觉得挺不错,可是现在才发现我被老谭坑了(不要拍砖)。就以冒泡来说,在老谭书里面是这样理解的:
    
void BubbleSort(SqList *L)   //SqList 是一个包含了一个数组,和该数组长度的结构体
    {
        int i,j;
        for(i = 0; i < L->length; i++){
            for(j = i+1; j < L->length; j++){
                if(L->r[i] > L->r[j]){
                    swap(L,i,j);   //交换函数
                }
            }
        }
    }

   

这样的排序虽然可以实现排序,可是并不符合冒泡的原理。

正宗的冒泡排序算法:

void BubbleSort(SqList *L){
	int i = 0, j = 0;
	
	for(i = 0; i < L->length; i++){
		for(j = L->length-1; j > i; j--){
			if(L->r[j] < L->r[j-1]){
				swap(L,j,j-1);
			}
		}
	}
}
优化之后的排序算法:
void BubbleSort_good(SqList *L){			
	int i, j;
	int flag = 0;
	
	for(i = 0; i < L->length && flag == 0; i++){
		flag = 1;
		for(j = L->length-1; j > i; j--){
			if(L->r[j] < L->r[j-1]){
				swap(L,j,j-1);
				flag = 0;
			}
		}
	}
}

简单的选择排序思想是:每次比较找到最小值后交换

void SelectSort(SqList *L){  // simple selection sort
	int i,j,min;
	
	for(i = 0; i < L->length; i++){
		min = i;
		for(j = i+1; j< L->length; j++){
			if(L->r[min] > L->r[j]){
				min = j;
			}
		}
		if(min != i){
			swap(L,min,i);
		}
	}
}



直接插入排序:将一个记录插入到已经排好的有序表中

void InsertSort(SqList *L){
	int temp = 0;
	int i, j;
	
	for(i = 1; i < L->length; i++){
		if(L->r[i] < L->r[i-1]){
			temp = a[i];
			for(j = i-1; j >= 0 && L->r[j] > temp; j--){
				L->[j+1] = L->[j];	//记录后移
			}
			L->[j+1] = temp;
		}
	}
}


你可能感兴趣的:(简单排序算法的总结)