【小镇的技术天梯】C语言,冒泡、快速、希尔、选择排序

【数组的排序同样是基础中的基础,相信你们用习惯了list.sort()之类的类库自带函数连一些最基本的算法基础都不会了,下面小镇带来最基本的四个排序。】

冒泡、选择排序是最为基础的排序。冒泡是每次比较相邻的项,然后一次一次将最小的数从某个位置冒泡到第一个。选择排序是找到相应位置的项放到相应的位置上去。

希尔排序是为了使比较差的情况的选择排序优化顺序。

快速排序有着二分法的思想,在数据量大的情况下时间会少一个数量级。时间复杂度是O(nlogn).

代码如下,基础而已很简单:

/* 冒泡排序、插入排序、希尔排序 */


/*
 * author:镇天宇
 */


#include <stdio.h>
#include <stdlib.h>
#include <memory.h>


//冒泡排序
void bubble_sort(int data[],int length)
{
	int j=0,i=0,temp=0;
	int flag=1;

	if(data==NULL||length==0)
		return;

	for(i=length-1;i>=1&&flag;i--){
		flag=0;
		for(j=0;j<i;j++){
			if(data[j]>data[j+1]){
				temp=data[j];
				data[j]=data[j+1];
				data[j+1]=temp;
				if(flag==0)
					flag=1;
			}
		}
	}
}

//插入排序
void insert_sort(int data[],int length)
{
	int j,i,temp=0;
	if(data==NULL||length==0)
		return;

	for(i=1;i<length;i++){
		for(j=i;j>=1;j--){
			if(data[j]<data[j-1]){
				temp=data[j];
				data[j]=data[j-1];
				data[j-1]=temp;
			}else{
				break;
			}
		}
	}
}

//希尔排序
void shell_sort(int array[], int length, int step)  
{  
    int j = 0;  
    int i = 0;  
    int median = 0;  
  
    if(NULL == array || 0 == length)  
        return;  
  
    for(; step >= 1; step -=2){  
        for(int index = 0; index < step; index ++){  
            if((length -1) < (index + step))  
                continue;  
            else{  
                i = index + step;  
                while( (i + step) <= (length - 1))  
                    i += step;  
            }  
  
            for(;  i >= (index + step);  i -= step){  
                for(j = index; j <= i - step; j += step){  
                    if(array[j] >= array[j + step]){  
                        median = array[j];  
                        array[j] = array[j + step];  
                        array[j + step] = median;  
                    }  
                }  
            }  
        }  
    }  
}  

//快速排序
void quick_sort( int data[], int left, int right )
{
	int i, j, temp;
	if ( left < right )
	{
		i = left; j = right; temp = data[i];
		while ( i < j )
		{
			while ( i<j &&data[j]>temp )
				j--;
			if ( i < j )
				data[i++] = data[j];
			while ( i < j && data[i] < temp )
				i++;
			if ( i < j )
				data[j--] = data[i];
		}
		data[i] = temp;
		quick_sort(data,left,i-1);
		quick_sort(data,i+1,right);
	}
}


int main()
{
	int array[20]={5,3,9,32,76,5,3,9,7,6};

	shell_sort(array,10,5);

	int i;
	for(i=0;i<10;i++)
	{
		printf("%d ", array[i]);
	}
}




你可能感兴趣的:(【小镇的技术天梯】C语言,冒泡、快速、希尔、选择排序)