现在的位置: 首页 > 综合 > 正文

总结几种常用的排序算法(含代码)

2014年09月05日 ⁄ 综合 ⁄ 共 3955字 ⁄ 字号 评论关闭

以下所有示例和说明都以升序为例。

本文图示借用了:http://blog.csdn.net/bjyfb/article/details/7513509

一、插入排序

1.直接插入排序

图示:


代码:

#include<stdio.h>
int list[100];
void insertsort(int n) {
	int i,j;
	for(i=2; i<=n; i++) {
		if(list[i] < list[i-1]) {
			list[0] = list[i];
			for(j=i-1; list[j]>list[0]; j--)
				list[j+1] = list[j];
			list[j+1] = list[0];
		}
		for(int p=1; p<=n; p++)
				printf("%d ",list[p]);
		printf("\n");
	}
}

int main() {
	int n;
	scanf("%d",&n);
	int i;
	for(i=1; i<=n; i++) {
		scanf("%d",&list[i]);
	}
	printf("排序过程:\n");
	insertsort(n);
}

输出示例:

2.折半插入排序

代码:

#include<stdio.h>
int list[100];
void binsertsort(int n) {
	int i,j,low,high,mid;
	for(i=2; i<=n; i++) {
		list[0] = list[i];
		low = 1; high = i-1;
		while(low <= high) {
			mid = (low + high) / 2;
			if(list[0] > list[mid])
				low = mid + 1;
			else
				high = mid - 1;
		}
		for(j=i; j>low; j--)
			list[j] = list[j-1];
		list[low] = list[0];
		for(j=1; j<=n; j++)
			printf("%d ",list[j]);
		printf("\n");
	}
}

int main() {
	int n;
	scanf("%d",&n);
	int i;
	for(i=1; i<=n; i++)
		scanf("%d",&list[i]);
	printf("排序过程:\n");
	binsertsort(n);
}

输出示例:


3.希尔排序

图示:


代码:

#include<stdio.h>
int list[100];
void shellsort(int n) {
	int k = n / 2;
	while(k > 0) {
		int i,j;
		for(i=k+1; i<=n; i++) { //此过程实际上为直接插入排序
			if(list[i] < list[i-k]) {
				list[0] = list[i];
				for(j=i-k; j>0&&list[j]>list[0]; j=j-k) {
					list[j+k] = list[j];
				}
				list[j+k] = list[0];
			}
		}
		k = k / 2;
		for(i=1; i<=n; i++)
			printf("%d ",list[i]);
		printf("\n");
	}
}

int main() {
	int n;
	scanf("%d",&n);
	int i;
	for(i=1; i<=n; i++) {
		scanf("%d",&list[i]);
	}
	printf("排序过程:\n");
	shellsort(n);
}

输出示例:



二、选择排序

1、简单选择排序

图示:


代码:

#include<stdio.h>
#include<stdlib.h>
int L[500];
int SelectMinKey(int s,int n)
{
    int min=L[s],k=s,i;
    for(i=s+1;i<=n;i++)
        if(L[i]<min)
        {
            min=L[i];
            k=i;
        }
    return k;
}
void SelectSort(int n)
{
    int i,j,t;
    for(i=1;i<n;i++)
    {
        j=SelectMinKey(i,n);
        if(i!=j)
        {
            t=L[i];L[i]=L[j];L[j]=t;
        }
        for(j=1;j<=n;j++)
            printf("%d ",L[j]);
        printf("\n");
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&L[i]);
	printf("排序过程:\n");
    SelectSort(n);
}

输出示例:


2、堆排序

图示:



代码:

#include<stdio.h>
int list[100];
void heapadjust(int s, int n)
{
	list[0] = list[s];
	for(int i=s*2; i<=n; i=i*2)
	{
		if(i<n && list[i+1]>list[i]) //找出两个孩子中大的一个的下标
			i++;
		if(list[0] >= list[i]) //若待插入结点比所有孩子都大,则不用再往下找了
			break;
		list[s] = list[i]; //父节点与大的孩子交换位置
		s = i;
	}
	list[s] = list[0]; 
}


void heapsort(int n)
{
	int i,j;
	for(i=n/2; i>0; i--) //建立大顶堆
		heapadjust(i,n);
	printf("初始化后大顶堆:\n");
	for(i=1; i<=n; i++)
		printf("%d ",list[i]);
	printf("\n");
	printf("排序过程:\n");
	for(i=n; i>1; i--){
		//取出堆顶,为最大数
		int temp = list[1];
		list[1] = list[i];
		list[i] = temp;
		//重新调整剩下的i-1个数
		heapadjust(1,i-1);
		for(j=1; j<=n; j++)
			printf("%d ",list[j]);
		printf("\n");
	}
}


int main()
{
	int n;
	scanf("%d",&n);
	int i;
	for(i=1; i<=n; i++)
		scanf("%d",&list[i]);
	heapsort(n);
}

输出示例:

三、交换排序

1、冒泡排序

图示:


代码:

#include<stdio.h>
int list[100];
void bubblesort(int n) 
{
	int i=1,j,lastchanged;//lastchanged用于减少遍历次数
	while(i<n)
	{
		lastchanged = n;
		for(j=n; j>i; j--)
		{
			if(list[j] < list[j-1])
			{
				int temp = list[j];
				list[j] = list[j-1];
				list[j-1] = temp;
				lastchanged = j; //lastchanged记录最后一次交换的位置,它后面的数已有序,所以下次只需从这个位置开始遍历
			}
		}
		i = lastchanged;
		for(j=1; j<=n; j++)
			printf("%d ", list[j]);
		printf("\n");
	}
}

int main() 
{
	int n;
	scanf("%d",&n);
	int i;
	for(i=1; i<=n; i++)
		scanf("%d",&list[i]);
	printf("排序过程:\n");
	bubblesort(n);
}

输出示例:


2、快速排序

图示:


代码:

#include<stdio.h>
#include<math.h>
int n;
int L[100];


int Partition(int low, int high) {
	L[0] = L[low];
	while(low < high) {
		while(low < high && L[high] >= L[0])
			high--;
		L[low] = L[high];
		while(low < high && L[low] < L[0])
			low++;
		L[high] = L[low];
	}
	L[low] = L[0];
	for(int i=1; i<=n; i++)
		printf("%d ",L[i]);
	printf("\n");
	return low;
}


void QSort(int low, int high) {
	if(low >= high)
		return;
	int p = Partition(low, high);
	QSort(low,p);
	QSort(p+1,high);
}


int main() {
	scanf("%d",&n);
	for(int i=1; i<=n; i++)
		scanf("%d",&L[i]);
	printf("排序过程:\n");
	QSort(1,n);
}

输出示例:

3、归并排序


代码:

#include<stdio.h>
int n,L[100],t[100];

void mergepass(int s, int m, int r) {
	int k=0;
	int i,j;
	for(i=s,j=m+1;i<=m && j<=r;k++) {
		if(L[i] < L[j])
			t[k] = L[i++];
		else
			t[k] = L[j++];
	}
	while(i<=m)
		t[k++] = L[i++];
	while(j<=r)
		t[k++] = L[j++];
	for(i=0; i<k; i++)
		L[i+s] = t[i];
}

void mergesort() {
	int s = 1;
	int i = 0;
	while(s < n) {
		while(i+s*2-1<n) {
			mergepass(i,i+s-1,i+s*2-1);
			i = i + s * 2;
		}
		if(i + s < n)
			mergepass(i,i+s-1,n-1);
		s = s * 2;
		i = 0;
		for(int j=0;j<n;j++)
			printf("%d ",L[j]);
		printf("\n");
	}
}

int main() {
	scanf("%d",&n);
	int i;
	for(i=0; i<n; i++)
		scanf("%d",&L[i]);
	printf("排序过程:\n");
	mergesort();
}

输出示例:


四、各种排序总结比较:


抱歉!评论已关闭.