排序算法(一)
来源:互联网 发布:虚拟网络的功能和作用 编辑:程序博客网 时间:2024/05/21 09:07
这几天把以前学的一些算法整理了下,不知道从哪里开始,就找排序算法好了……
所谓排序,就是要整理数组中的记录,使之按关键字递增(递减)次序排列起来。
准确的定义:
输入:n个记录R1,R2,R3,...Rn,其对应的关键字分别为k1,k2,k3,...,kn。
输出:Ri1,Ri2,Ri3,...Rin,使得ki1<=,ki2<=,ki3<=,...,<=kin(或ki1>=,ki2>=,ki3>=,...,>=kin)。
插入排序:
插入排序(Insertion sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子数组中的适当位置,知道全部记录插入完全为止。
直接插入排序和希尔(Shell)排序都属于插入排序。
直接插入排序:
直接插入排序是稳定的排序方法。插入排序的基本思想是假设待排序的记录存在数组R[1...n]中。初始时,R[1]为有序区,R[2...n]为无序区,从i=2开始到i=n结束,一次将R[i]插入到当前有序区R[1...i-1]中,生成n个记录的有序区。
1、在有序区R[1...i-1]中查找比较确定R[i]的插入位置k(1<=k<=i-1)
2、将R[k...i-1]中的记录后移一位,空出k位置上的空间插入R[i]
改进: 比较操作和记录移动同时进行R[i]从右向左依次与有序区记录R[j](j=i-1,i-2,...,1)比较
1、if R[j]>R[i] then R[j]后移一位
2、if R[j]<=R[i] then 查找结束,(j+1)为R[i]的插入位置。
算法实现:
#include <stdio.h>
#include <stdlib.h>
void print_array(int* pData, int n)
{
int i;
for (i = 0; i < n; ++i)
{
printf("%d ", pData[i]);
}
printf("/n");
}
void insert_sort(int* pData, int n)
{
int i, j, nTemp;
for (i = 1; i < n; ++i)
{
nTemp = pData[i];
for (j = i-1; j >= 0 && nTemp < pData[j]; --j)
{
pData[j+1] = pData[j];
}
pData[j+1] = nTemp;
}
}
int main()
{
int n, i;
int* pData;
while(printf("please input the num:/n") && 1 == scanf("%d", &n))
{
pData = (int *)malloc(n * sizeof(int));
printf("please input the data to sort:/n");
for (i = 0; i < n; ++i)
scanf("%d", &pData[i]);
printf("Before sorted:");
print_array(pData, n);
printf("After sorted:");
insert_sort(pData, n);
print_array(pData, n);
free(pData);
}
return 0;
}
希尔(shell)排序:
希尔(shell)排序基本思想:将要排序的一组数按某个增量d分成若干组,对每组中全部元素进行排序,然后用一个较小的增量对它进行再次分组,并对每个新组进行排序。当增量减到1时,整个要排序的数就被分成一组,排序完成。
希尔排序是不稳定排序。
算法实现:
#include <stdio.h> void print_array(int* pData, int n) int i; void shell_sort(int* pData, int n) nTemp = pData[i]; for (j = i-d; j>=0 && nTemp<pData[j]; j-=d) { pData[j+d] = pData[j]; } int main()
#include <stdlib.h>
{
for (i = 0; i < n; ++i)
{
printf("%d ", pData[i]);
}
printf("/n");
}
{
int d, i, j, nTemp;
for (d = n/2; d > 0; d/=2)
{
for (i = d; i < n; ++j)
{
pData[j+d] = nTemp;
}
}
}
{
int n, i;
int* pData;
while(printf("please input the num:/n") && 1 == scanf("%d", &n))
{
pData = (int *)malloc(n * sizeof(int));
printf("please input the data to sort:/n");
for (i = 0; i < n; ++i)
scanf("%d", &pData[i]);
printf("Before sorted:");
print_array(pData, n);
printf("After sorted:");
shell_sort(pData, n);
print_array(pData, n);
free(pData);
}
return 0;
}
- 排序算法(一)
- 排序算法(一)
- 排序算法(一)
- 排序算法(一)
- 排序算法(一)
- 排序算法(一)
- 排序算法(一)
- 排序算法(一)
- 排序算法(一)
- 排序算法 (一)
- 算法(一):排序
- 排序算法(一)
- 排序算法介绍(一)
- 排序算法小记(一)
- 排序算法总结(一)
- 【算法导论】排序(一)
- 排序算法总结(一)
- 排序算法(一):基本概念
- Berkeley 云计算白皮书读书笔记
- Set up the VNC Server in Fedora
- 一个应用程序实例
- 分布式影音转码软件技术预览
- 使用 BizTalk 从 MSMQ 中接收消息
- 排序算法(一)
- VS2005 Team Suit SP1中文版 快捷键设置
- SpringBean的作用域
- 使用system.alt修复system
- 欢迎来我家
- Asterisk安装成功!
- 现实的困惑
- 一点感悟....
- 分治算法中棋盘覆盖问题(c语言实现)