用C语言总结一下常用排序算法,虽然大多数语言里已经提供了排序算法,比如C函数库中提供了qsort排序函数(内部为快速排序实现),但理解排序算法的思想的意义远远超过了实用的价值。这里我总结了常用的排序算法,并用C语言实现。这些算法的书写顺序也有一定的关联,比如希尔排序是对插入算法的改进,快速排序是对冒泡排序的改进,快速排序和归并排序都用递归实现。
注:每种方法的实现尽量提供了相同的形参列表。这里并没用涉及堆排序,箱排序等算法的实现。
插入排序
算法概要:插入排序依据遍历到第N个元素的时候前面的N-1个元素已经是排序好的,那么就查找前面的N-1个元素把这第N个元素放在合适的位置,如此下去直到遍历完序列的元素为止。
Code:
void insertSort(int array[], int length)
{
int key;
for(int i=1; i<length; i++)
{
key = array[i];
for(int j=i-1; j>=0 && array[j] > key; j--)
{
array[j+1] = array[j];
}
array[j+1] = key;
}
}
希尔排序
算法概要:shell排序是对插入排序的一个改装,它每次排序排序根据一个增量获取一个序列,对这这个子序列进行插入排序,然后不断的缩小增量扩大子序列的元素数量,直到增量为1的时候子序列就和原先的待排列序列一样了,此时只需要做少量的比较和移动就可以完成对序列的排序了。
Code:
void shellSort(int array[], int length)
{
int key;
int increment;
for(increment = length/2; increment>0; increment /= 2)
{
for(int i=increment; i<length; i++)
{
key = array[i];
for(int j = i-increment; j>=0 && array[j] > key; j -= increment)
{
array[j+increment] = array[j];
}
array[j+increment]=key;
}
}
}
冒泡排序
算法概要:冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数。
Code:
void bubbleSort(int array[], int length)
{
int flag = 0;
for(int i=0; i<length-1; i++)
{
for(int j=0; j<length-1-i; j++)
{
if(array[j]>array[j+1])
{
flag = 1;
array[j] = array[j] + array[j+1];
array[j+1] = array[j] - array[j+1];
array[j] = array[j] - array[j+1];
}
}
if(flag == 0) break;
}
}
快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
Code:
int Sort(int array[], int first, int last)
{
int pivot = array[first];
int temp;
if(last-first <=0) return -1;
while(first != last)
{
while(array[last] >= pivot && last != first) last--;
temp = array[first];
array[first] = array[last];
array[last] = temp;
while(array[first] <= pivot && last != first) first++;
temp = array[first];
array[first] = array[last];
array[last] = temp;
}
return last;
}
void quickSort(int array[], int length)
{
int temp = Sort(array, 0, length-1);
if(temp == -1 ) return;
quickSort(array,temp+1);
quickSort(&array[temp+1],length-temp-1);
}
归并排序
算法概要:归并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
Code:
void Merge(int A[],int low,int mid,int high)
{
int i,j,k;
int *P = new int[mid-low+1],*Q = new int[high-mid];
for (i =0;i < mid - low +1;++i) P[i] = A[i+low];
for (i = 0; i < high - mid;++i) Q[i] = A[mid+1+i];
i = j = 0,k = low;
while ((i <= mid-low) && (j <= high-mid-1))
{
if (P[i] <= Q[j]) A[k++] = P[i++];
else A[k++]= Q[j++];
}
if (i > mid - low) { for (;j <= high-mid-1;++j) A[k++] = Q[j]; }
else
{ for (; i <= mid - low;++i) A[k++] = P[i]; }
delete [] P;
delete [] Q;
}
void mergeSort(int A[],int left,int right)
{
if (left < right)
{
int i = (left + right) / 2;
MergeSort(A,left,i);
MergeSort(A,i+1,right);
Merge(A,left,i,right);
}
}
c语言排序算法
时间: 2024-10-23 21:05:58
c语言排序算法的相关文章
杂文 - [1.1]使用库语言排序算法
[1.1]使用库语言排序算法 本文地址: http://blog.csdn.net/caroline_wendy 如果不缺少内存, 可以直接使用库的排序算法. 使用库语言的排序程序: C语言性能最好的算法是快速排序(quick sort). C++性能最好的是集合(set)的排序算法. C语言代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <std
C语言排序算法总结
学计算机程序设计的应该都知道,算法是程序之魂.所谓算法,就是解决问题的方法加上有限的实现步骤.算法的特点有有穷性,确定性,有效性,有零个或多个输入,有一个或多个输出.下面我们就来简单总结一下C语言中的三种经典排序算法. 一.冒泡算法. 所谓冒泡排序法,就是对一组数字进行从大到小或从小到大排序的一种算法.具体方法是,相邻的数字两两交换.从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不相同,则将两个数的位置进行交换(对调):如果其余我们期望的相同,则不交换位置.重复这样的过程,一直到最后没有
C语言排序算法复习
排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序,8大的还有基数排序.各有各的版本,代码写法也各不相同.所以这里以整理思路为先,代码只是作为自己的一个备份. 搞清楚的概念:稳定排序和不稳定排序,就看序列中两个值相等的数,排完序之后的相对位置是否改变,如果改变了就不稳定. 内部排序和外部排序,只用到内存即可完成排序的就叫内部排
C语言排序算法之简单交换法排序,直接选择排序,冒泡排序
C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 1 /*简单交换法排序 2 根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置 3 交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动 4 不稳定 5 */ 6 #include<windows.h> 7 #include<stdio.h> 8 void main(){ 9 int i,j,arr[10
C语言 排序算法 - 数据结构学习笔记
/** 功能: 排序 *日期: 2017年9月24日 *作者: yzh *开发环境: QT **/ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STACK_LENGTH 100 //非递归快速排序调用栈 #define MAX_LENGTH 20 //数组最大值 //对于数值型 keyType #de
C语言排序算法——简单选择排序算法
冒泡排序算法的思想是不断的交换,通过交换完成最终的排序. 选择排序的基本思想是每一趟在n-i+1个记录中选取最小的记录,作为第i个的记录. 1 void SimpleSelectSort(int *p) 2 { 3 int i,j,min; 4 for(i=0;i<10;i++) 5 { 6 min=i; //将当前下标定义为最小下标 7 for(j=i+1;j<10;j++) 8 { 9 if(p[min>p[j]]) //如果有小于当前最小值的 10 { 11 min=j
【算法】C语言排序算法整理
/** * 快速排序算法 */ void quick_sort (int *s, int l, int r) { if (l < r) { int i = l, j = r, x = s[l]; while (i < j) { while (i < j && s[j] >= x) j--; if (i < j) s[i++] = s[j]; while (i < j && s[i] < x) i++; if (i < j) s
Go语言排序算法实现
// Algorithm project Algorithm.go package Algorithm // 冒泡排序 func BubbleSort(a []int) { n := len(a) for i := n; i > 1; i-- { for j := 0; j < i-1; j++ { if a[j] > a[j+1] { a[j], a[j+1] = a[j+1], a[j] } } } } // 选择排序 func SelectSort(a []int) { n :=
两种常用的C语言排序算法
1. 要求输入10个整数,从大到小排序输出 输入:2 0 3 -4 8 9 5 1 7 6 输出:9 8 7 6 5 3 2 1 0 -4 解决方法:选择排序法 实现代码如下: #include <stdio.h> int main(int argc, const char * argv[]) { int num[10],i,j,k,l,temp; //用一个数组保存输入的数据 for(i=0;i<=9;i++) { scanf("%d",&num[i]);