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

原创 2014年04月27日 12:53:16

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

本文图示借用了: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]);
<span style="white-space:pre">	</span>printf("排序过程:\n");
    SelectSort(n);
}
输出示例:


2、堆排序

图示:



代码:

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


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


int main()
{
<span style="white-space:pre">	</span>int n;
<span style="white-space:pre">	</span>scanf("%d",&n);
<span style="white-space:pre">	</span>int i;
<span style="white-space:pre">	</span>for(i=1; i<=n; i++)
<span style="white-space:pre">		</span>scanf("%d",&list[i]);
<span style="white-space:pre">	</span>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) {
<span style="white-space:pre">	</span>L[0] = L[low];
<span style="white-space:pre">	</span>while(low < high) {
<span style="white-space:pre">		</span>while(low < high && L[high] >= L[0])
<span style="white-space:pre">			</span>high--;
<span style="white-space:pre">		</span>L[low] = L[high];
<span style="white-space:pre">		</span>while(low < high && L[low] < L[0])
<span style="white-space:pre">			</span>low++;
<span style="white-space:pre">		</span>L[high] = L[low];
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>L[low] = L[0];
<span style="white-space:pre">	</span>for(int i=1; i<=n; i++)
<span style="white-space:pre">		</span>printf("%d ",L[i]);
<span style="white-space:pre">	</span>printf("\n");
<span style="white-space:pre">	</span>return low;
}


void QSort(int low, int high) {
<span style="white-space:pre">	</span>if(low >= high)
<span style="white-space:pre">		</span>return;
<span style="white-space:pre">	</span>int p = Partition(low, high);
<span style="white-space:pre">	</span>QSort(low,p);
<span style="white-space:pre">	</span>QSort(p+1,high);
}


int main() {
<span style="white-space:pre">	</span>scanf("%d",&n);
<span style="white-space:pre">	</span>for(int i=1; i<=n; i++)
<span style="white-space:pre">		</span>scanf("%d",&L[i]);
<span style="white-space:pre">	</span>printf("排序过程:\n");
<span style="white-space:pre">	</span>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();
}
输出示例:


四、各种排序总结比较:


相关文章推荐

常用排序算法总结(含Java代码)

  • 2015年09月21日 17:10
  • 340KB
  • 下载

JAVA几种常用的排序算法

  • 2009年08月08日 22:19
  • 2KB
  • 下载

Python - 常用的几种排序算法总结

总结一下几种常见的排序算法先做一个整体比较: 排序法 平均时间 最差情形 稳定度 额外空间 备注 冒泡 O(n2)O(n^2) O(n2)O(n^2) 稳定 ...
  • jark_
  • jark_
  • 2017年08月04日 10:23
  • 135

几种常用排序算法的C语言实现

  • 2009年10月21日 11:24
  • 6KB
  • 下载

几种排序算法的代码实现

  • 2012年05月30日 12:20
  • 82KB
  • 下载

几种常用排序算法总结

所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。当待排序记录的关键字都不相同时,排序结果是惟一的,否则排序结果不惟一。     在待排序的文件中,若存在多个关键字相同的记录...

几种常用的排序算法总结

几种常用的算法的时间空间复杂度 1、冒泡排序 思想:比较相邻的元素,如果第一个元素比第二个大,就交换位置,对每一对相邻的元素进行同样的操作。这样最后的元素应该是最大的数。排除最后一个数...

几种常用排序算法总结(转载)

所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。当待排序记录的关键字都不相同时,排序结果是惟一的,否则排序结果不惟一。    在待排序的文件中,若存在多个关键字相同的记录,经...

几种排序算法总结及比较

  • 2016年12月01日 16:35
  • 4.09MB
  • 下载

常用排序算法总结(转载,据说代码中存在错误,使用时请慎重)

所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。当待排序记录的关键字都不相同时,排序结果是惟一的,否则排序结果不惟一。 在待排序的文件中,若存在多个关键字相同的记录,经过排...
  • sjg5311
  • sjg5311
  • 2014年10月21日 09:29
  • 471
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:总结几种常用的排序算法(含代码)
举报原因:
原因补充:

(最多只允许输入30个字)