本文目录一览:
c语言三种排序
常用的c语言排序算法主要有三种即冒泡法排序、选择法排序、插入法排序。
一、冒泡排序冒泡排序:
是从第一个数开始,依次往后比较,在满足判断条件下进行交换。代码实现(以降序排序为例)
#includestdio.h
int main()
{
int array[10] = { 6,9,7,8,5,3,4,0,1,2 };
int temp;
for (int i = 0; i 10; i++)
{//循环次数
for (int j = 0; j 10 - i-1; j++)
{
if (array[j] array[j+1])
{//前面一个数比后面的数大时发生交换 temp = array[j];
array[j] = array[j+1];
array[j + 1] = temp;
}
}
} //打印数组 for (int i = 0; i 10; i++) printf("%2d", array[i]); return 0;}}
二、选择排序以升序排序为例:
就是在指定下标的数组元素往后(指定下标的元素往往是从第一个元素开始,然后依次往后),找出除指定下标元素外的值与指定元素进行对比,满足条件就进行交换。与冒泡排序的区别可以理解为冒泡排序是相邻的两个值对比,而选择排序是遍历数组,找出数组元素与指定的数组元素进行对比。(以升序为例)
#includestdio.h
int main()
{
int array[10] = { 6,9,7,8,5,3,4,0,1,2 };
int temp, index;
for (int i = 0; i 9; i++) {
index = i;
for (int j = i; j 10; j++)
{
if (array[j] array[index])
index = j;
}
if(i != index)
{
temp = array[i];
array[i] = array[index];
array[index] = temp;
}
for(int i=0;i10:i++)
printf("%2d"array[i])
return 0;
}
三、快速排序
是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
void QuickSort(int* arr, int size)
{
int temp, i, j;
for(i = 1; i size; i++)
for(j=i; j0; j--)
{
if(arr[j] arr[j-1])
{
temp = arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
}
}
c语言中 顺序表的选择排序是什么?
选择排序(Selection sort)是一种简单直观的排序算法。工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
以下是一个实现选择排序的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
#define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t))
//将list中的n个数据,通过选择排序算法排序。
void selete_sort(int list[], int n)
{
int i, j, min, temp;
for (i = 0; i n - 1; i++){
min = i;
for (j = i + 1; j n; j++)//找出最小元素的下标。
if (list[j] list[min])
min = j;
SWAP(list[i], list[min], temp);//交换最小元素到当前起始位置。
顺序表的排序,二分法查找的c语言程序
#includestdio.h
int fun(int a[],int n,int key)
{i
nt low,mid,high;//low、mid、high是三个索引分别指向数组的下标low=0;//low指向数组a[]的第一个元素,即下表为0的元素
high=n-1;//lhigh指向数组a[]的最一个元素,即下表为n-1的元素,n为数组的长度
while(low=high)//循环终止条件是lowhigh的时候
{
mid=(low+high)/2;//所谓二分查找就在这里,每次都让mid指向数组下标等于low和high之和的一半的元素i
f(keya[mid])//如果a【mid】大于要查找的元素,说明要查找的元素在low和mid之间,这是需要把high重新置为mid-1
(high=mid-1);//这里应该是{},不能使()吧
else if(keya[mid])//这里同理,如果a【mid】小于要查找的元素,说明要查找的元素在mid和high之间,这是需要把low重新置为mid+1
(low=mid+1);
else
return mid;//剩下的就是相等的情况,直接返回mid就是查找到的结果
}
return -1;//执行到这一步就说明,lowhigh,没有找到要查找的元素,返回-1表示没有结果
}
main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int a,b,c;
b=4;
c=fun(a,10,b);
if(c==1)
printf("not found");
else
printf("psition %d\n",c);
}
C语言顺序表的基本操作
#include stdio.h
#include stdlib.h
typedef int DataType; // 定义数据数据类型
typedef struct {
DataType *data; // data指向数据区的首个数据
int length; // 数据长度
}SqList;
void Sort(SqList *L) {
int i,j,k;
DataType tmp;
for(i = 0; i L-length - 1; ++i) {
k = i;
for(j = i + 1; j L-length; ++j)
if(L-data[k] L-data[j])
k = j;
if(k != i) {
tmp = L-data[k];
L-data[k] = L-data[i];
L-data[i] = tmp;
}
}
}
SqList *CreateList(DataType a[],int n) {
int i;
SqList *L;
L = (SqList *)malloc(sizeof(SqList));
L-data = (DataType *)malloc(n * sizeof(DataType));
L-length = n;
for(i = 0; i n; ++i) L-data[i] = a[i];
Sort(L);
return L;
}
int InsertList(SqList *L,DataType x) {
int i,j;
for (i = 0;i L-length;i++) {
if(x = L-data[i]) {
for(j = L-length;j = i;j--)
L-data[j + 1] = L-data[j]; // 结点后移
L-data[i] = x;
L-length++;
return 1;
}
}
L-data[L-length++] = x;
return 1;
}
int RemoveListElem(SqList *L,DataType d) {
int i,j;
for(i = 0; i L-length; ++i) {
if(L-data[i] == d) {
for(j = i; j L-length - 1; ++j)
L-data[j] = L-data[j + 1];
L-length--;
return 1;
}
}
return 0;
}
SqList *AndList(SqList *A, SqList *B) { /* A∩B */
int i,j,k = 0;
int len = (A-length B-length) ? B-length : A-length;
SqList *C = (SqList *)malloc(sizeof(SqList));
C-length = len;
C-data = (DataType *)malloc(len * sizeof(DataType));
for(i = 0; i A-length; ++i) {
for(j = 0; j B-length; ++j) {
if(A-data[i] == B-data[j]) {
C-data[k++] = A-data[i];
break;
}
}
}
C-length = k;
return C;
}
SqList *OrList(SqList *A, SqList *B) { /* A∪B */
int i,j,flag;
DataType e;
SqList *C = (SqList *)malloc(sizeof(SqList));
C-length = A-length + B-length;
C-data = (DataType *)malloc(C-length * sizeof(DataType));
for(i = 0; i A-length; ++i) C-data[i] = A-data[i];
for(i = 0; i B-length; ++i) {
e = B-data[i];
flag = 1;
for(j = 0; j C-length; ++j) {
if(e == C-data[j]) {
flag = 0;
break;
}
}
if(flag) InsertList(C,e);
}
return C;
}
void PrintList(SqList *L) {
int i;
for(i = 0; i L-length; ++i)
printf("%d ",L-data[i]);
printf("\n");
}
void FreeList(SqList *L) {
free(L-data);
free(L);
}
void main() {
DataType x;
DataType arra[] = {36,24,31,5,90,65,70,39,37};
DataType arrb[] = {9,8,43,51,37,89,33,46,29,80,56};
int alen = sizeof(arra)/sizeof(arra[0]);
int blen = sizeof(arrb)/sizeof(arrb[0]);
SqList *A = CreateList(arra,alen);
printf("A线性表为: ");
PrintList(A);
SqList *B = CreateList(arrb,blen);
printf("B线性表为: ");
PrintList(B);
SqList *C = AndList(A,B);
SqList *D = OrList(A,B);
printf(" C = A∩B: ");
PrintList(C);
printf(" D = A∪B: ");
PrintList(D);
printf("在D表中插入数据 : ");
scanf("%d",x);
InsertList(D,x);
printf("D表插入x后 :");
PrintList(D);
printf("删除D表中数据 : ");
scanf("%d",x);
RemoveListElem(D,x);
printf("删除x后的D表为 :");
PrintList(D);
FreeList(A);
FreeList(B);
FreeList(C);
FreeList(D);
}