经典八大排序算法(C语言)

这些排序只给出了算法,没有实现思路,也省略了swap函数的定义,别问为什么,因为懒.

一、冒泡排序

void BubbleSort(){
     
    int a[N];
    for(int i=0;i<N-1;i++){
     
    	for(int j=0;j<N-1;j++){
     
    	    if(a[j]>a[j+1]) swap(&a[j],&a[j+1]);
    	}
    }
}

当数组元素部分有序时,也可以再定义一个变量,作为排序是否进行的判断条件.

void BubbleSortII(){
     
	int a[N];
	for(int i=0;i<N-1;i++){
     
		int flag=0;
		for(int j=0;j<N-1-i;j++){
     
			if(a[j]>a[j+1]) {
     
				swap(&a[j],&a[j+1]);
				flag=1;
			}
		}
		if(flag==0) break;
	}
} 

二、选择排序

void SelectSort(){
     
    int a[N];
    for(int i=0;i<N-1;i++){
     
        int min=i;
        for(int j=i+1;j<N-1;j++){
     
            if(a[j]<a[min])	min=j;
        }
        swap(&a[i],&a[min]);
    }
}

三、直接插入排序

void InsertSort(){
     
    int a[N];
    for(int i=1;i<N;i++){
     
        int temp=a[i];
        int j=0;
        for(j=i-1;j>=0;j--){
     
            if(a[j]>temp) a[j+1]=a[j];
            else break;
        }
        a[j+1]=temp;
    }
}

四、希尔排序

#include
#define N 10
void ShellSort(int*a,int len,int gap);
void main(){
     	
	int a[N];
    	for(int i=0;i<N;i++){
     
        	scanf("%d",&a[i]);
    	}
    	int gap[]={
     5,3,1};
    	for(int temp=0;temp< sizeof(gap)/ sizeof(gap[0]);temp++){
     
        	ShellSort(a,N,gap[temp]);
   	 }
    	for(int i=0;i<N;i++){
     
	       	 printf("%d",a[i]);
   	 }
}
void ShellSort(int*a,int len,int gap){
     
    for(int i=0;i<gap;i++){
     //对分了组的元素进行直接插入排序
        for(int j=gap;j<len;j+=gap){
     
            int temp=a[j];
            int k=j-gap;
            for(;k>=0;k-=gap){
     
                if(a[k]>temp) a[k+gap]=a[k];
                else break;
            }
            a[k+gap]=temp;
        }
    }
}

五、快速排序

int QuickSort(){
     
    int a[N];
    int low=0;
    int high=N-1;
    while(low<high){
     
    	while(low<high&&a[high]>=a[low]) high--;
    	swap(&a[high],&a[low]);
    	while(low<high&&a[low]<=a[high]) low++;
    	swap(&a[high],&a[low]);
    }
    return low;
}//快排后,原数组首元素将数组分成两部分,只需再分别对这两部分进行排序即可,这里省略

六、堆排序

#include 
#define N 10

void  swap (int array[], int i, int j){
     
    int temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

void  printAaray(int array[] ,int len){
     
       for(int i=0; i < len; i++)   printf("%d  ", array[i]);
       printf("\n");
}

/* 调整堆 */
void heap_ajust(int arr[], int start, int end) {
     
    //建立父节点下标和子节点下标
    int dad = start;
    int son = dad * 2 + 1;
    while (son <= end) {
      //
        if (son + 1 <= end && arr[son] < arr[son + 1]) //先比较两個子节点大小,选择最大的
            son++;
        if (arr[dad] > arr[son]) break;
        else {
       swap(arr,dad,son);
                dad = son;
                son = dad * 2 + 1;
        }
    }
}

/* 堆排序 */
void heap_sort(int arr[], int len) {
     
    int i;
    //初始化堆,i从最后一個父节点开始调整
    // 建立最大堆
    for (i = len / 2 - 1; i >= 0; i--) {
     
        heap_ajust(arr, i, len - 1);
    }
    //先将第一個元素和已排好元素前一位做交换,再从新调整,直到排序完毕
    for (i = len - 1; i > 0; --i) {
     
        swap(arr,0,i);
        heap_ajust(arr, 0, i-1);
    }
}

void main(int argc, char const *argv[]) {
     
    int a[N];
    for(int i=0;i<N;i++) scanf("%d",&a[i]);
    heap_sort(a, N);
    printAaray(a,N);
}

七、归并排序

#include
#define N 10
void Mergesort(int *num,int left,int right);
void Merge(int *num,int left,int middle,int right);
void swap(int *a,int *b);
void main()
{
     
    int a[N];
    for(int i=0;i<N;i++) scanf("%d",&a[i]);
    Mergesort(a,0,N-1);
    for(int i=0;i<N;i++printf("%d ",a[i]);
}

void Mergesort(int *num,int left,int right)
{
     
    int middle=(left+right)/2;
    if(left==right) break;
    Mergesort(num,left,middle);
    Mergesort(num,middle+1,right);
    Merge(num,left,middle,right);
}

void Merge(int *num,int left,int middle,int right)
{
     //先对左部分进行排序,再依次向其中插入右部分元素
    for(int i=middle+1;i<=right;i++)
    {
     
        for(int j=i;j>left;j--)
        {
     
            if(num[j]<num[j-1]) swap(&num[j],&num[j-1]);
        }
    }
}

void swap(int *a,int *b)
{
     
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}

八、基数排序

#include
#define Max_ 10      //数组个数
#define RADIX_10 10    //整形排序
#define KEYNUM_31 10     //关键字个数,这里为整形位数

void Show(int  arr[], int n)
{
         int i;
     for ( i=0; i<n; i++ )
        printf("%d  ", arr[i]);
     printf("\n");
}

// 找到num的从低到高的第pos位的数据
int GetNumInPos(int num,int pos)
{
     	int temp = 1;
	for (int i = 0; i < pos - 1; i++)
		temp *= 10;
	return (num / temp) % 10;
}

//基数排序  pDataArray 无序数组;iDataNum为无序数据个数
void RadixSort(int* pDataArray, int iDataNum)
{
     	int *radixArrays[RADIX_10];    //分别为0~9的序列空间
	for (int i = 0; i < 10; i++)
	{
     	radixArrays[i] = (int *)malloc(sizeof(int) * (iDataNum + 1));
		radixArrays[i][0] = 0;    //index为0处记录这组数据的个数
	}
	for (int pos = 1; pos <= KEYNUM_31; pos++)    //从个位开始到31位
	{
     	for (int i = 0; i < iDataNum; i++)    //分配过程
		{
     	int num = GetNumInPos(pDataArray[i], pos);			
		        int index = ++radixArrays[num][0];
			radixArrays[num][index] = pDataArray[i];
		}
		for (int i = 0, j =0; i < RADIX_10; i++)    //收集
		{
     
			for (int k = 1; k <= radixArrays[i][0]; k++)
				pDataArray[j++] = radixArrays[i][k];
			radixArrays[i][0] = 0;    //复位
		}
	}
}

int main()
{
       
    int arr_test[Max_]for(int i=0;i<Max_;i++) scanf("%d",&arr_test[i]);
    RadixSort( arr_test, Max_);
    Show( arr_test, Max_ );
    return 0;
}

反正也没人看,就怎么随便怎么写了

你可能感兴趣的:(笔记)