(伪)冒泡排序算法: 相邻的两个元素之间,如果反序则交换数值,直到没有反序的记录为止.
#include <stdio.h>
void BubbleSort(int Array[], int ArraySize) { int x, y, temporary;
for (x = 0; x < ArraySize - 1; x++) { for (y = x + 1; y < ArraySize; y++) { if (Array[x] > Array[y]) { temporary = Array[y]; Array[y] = Array[x]; Array[x] = temporary; } } } }
int main(int argc, char* argv[]) { int a[10] = { 2, 5, 6, 8, 2, 3, 9, 1, 8, 0 };
BubbleSort(a, 10);
for (int i = 0; i < 10; i++) { printf("%d ", a[i]); }
system("pause"); return 0; }
|
(真)冒泡排序算法: 正宗的冒泡排序就是从下往上两两比较,所以看上去就像是泡泡向上冒一样.
#include <stdio.h>
void BubbleSort(int Array[], int ArraySize) { int x, y, temporary;
for (x = 0; x < ArraySize - 1; x++) { for (y = ArraySize - 1; y > x; y--) { if (Array[y-1] > Array[y]) { temporary = Array[y-1]; Array[y-1] = Array[y]; Array[y] = temporary; } } } }
int main(int argc, char* argv[]) { int a[10] = { 2, 5, 6, 8, 2, 3, 9, 1, 8, 0 };
BubbleSort(a, 10);
for (int i = 0; i < 10; i++) { printf("%d ", a[i]); }
system("pause"); return 0; }
|
选择排序算法: 该算法通过Array-x
次关键字比较,从Array-x+1
个记录中选出关键字最小的记录,并和第x个记录交换.
#include <stdio.h>
void SelectSort(int Array[], int ArraySize) { int x, y, minimum, temporary;
for (x = 0; x < ArraySize - 1; x++) { minimum = x; for (y = x + 1; y < ArraySize; y++) { if (Array[y] < Array[minimum]) minimum = y; } if (minimum != x) { temporary = Array[minimum]; Array[minimum] = Array[x]; Array[x] = temporary; } } }
int main(int argc, char* argv[]) { int a[10] = { 2, 5, 6, 8, 2, 3, 9, 1, 8, 0 };
SelectSort(a, 10);
for (int i = 0; i < 10; i++) { printf("%d ", a[i]); }
system("pause"); return 0; }
|
直接插入排序: 该算法将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增加1的有序表.
#include <stdio.h>
void InsertSort(int Array[], int ArraySize) { int x, y, temporary;
for (x = 1; x < ArraySize; x++) { if (Array[x] < Array[x - 1]) { temporary = Array[x]; for (y = x - 1; Array[y] > temporary; y--) { Array[y + 1] = Array[y]; } Array[y + 1] = temporary; } } }
int main(int argc, char* argv[]) { int a[10] = { 2, 5, 6, 8, 2, 3, 9, 1, 8, 0 };
InsertSort(a, 10);
for (int i = 0; i < 10; i++) { printf("%d ", a[i]); }
system("pause"); return 0; }
|
(分组)希尔排序: 在直接插入排序进行升级,把记录进行分组,分割成若干个子序列,把每一个子序列分别进行插入排序.
#include <stdio.h>
void ShellSort(int Array[], int ArraySize) { int x, y, temporary; int interval = ArraySize;
do { interval = interval / 3 + 1; for (x = interval; x < ArraySize; x++) { if (Array[x] < Array[x - interval]) { temporary = Array[x]; for (y = x - interval; Array[y] > temporary; y -= interval) { Array[y + interval] = Array[y]; } Array[y + interval] = temporary; } } } while (interval > 1); }
int main(int argc, char* argv[]) { int a[10] = { 2, 5, 6, 8, 2, 3, 9, 1, 8, 0 };
ShellSort(a, 10);
for (int i = 0; i < 10; i++) { printf("%d ", a[i]); }
system("pause"); return 0; }
|
归并排序算法: 将数组拆分成两部分,然后将每部分再次拆成两部分,直到无法拆了为止,然后两两比较,最后在归并到一起.
#include <stdio.h> #define MAXSIZE 10
void merging(int *list1,int list1_size,int *list2,int list2_size) { int list1_sub = 0, list2_sub = 0, k = 0; int temporary[MAXSIZE];
while (list1_sub < list1_size && list2_sub < list2_size) { if (list1[list1_sub] < list2[list2_sub]) temporary[k++] = list1[list1_sub++]; else temporary[k++] = list2[list2_sub++]; } while (list1_sub < list1_size) temporary[k++] = list1[list1_sub++]; while (list2_sub < list2_size) temporary[k++] = list2[list2_sub++];
for (int m = 0; m < (list1_size + list2_size); m++) list1[m] = temporary[m]; }
void MergeSort(int Array[], int ArraySize) { if (ArraySize > 1) { int *list1 = Array; int list1_size = ArraySize / 2;
int *list2 = Array + ArraySize / 2; int list2_size = ArraySize - list1_size;
MergeSort(list1, list1_size); MergeSort(list2, list2_size); merging(list1, list1_size, list2, list2_size); } }
int main(int argc, char* argv[]) { int a[10] = { 2, 5, 6, 8, 2, 3, 9, 1, 8, 0 };
MergeSort(a, 10); for (int i = 0; i < 10; i++) printf("%d ", a[i]);
system("pause"); return 0; }
|
迭代归并排序: 代码指针存在问题.
#include <stdio.h> #include <stdlib.h>
void MergeSort(int k[], int n) { int i, left_min, left_max, right_min, right_max; int *temp = (int *)malloc(n * sizeof(int)); for (i = 1; i < n; i *= 2) { for (left_min = 0; left_min < n - i; left_min = right_max) { right_min = left_max = left_min + i; right_max = left_max + i; if (right_max > n) { right_max = n; } int next = 0; while (left_min < left_max && right_min < right_max) { if (k[left_min] < k[right_min]) { temp[next++] = k[left_min]; } else { temp[next++] = k[right_min]; } }
while (left_min < left_max) { k[--right_min] = k[--left_min]; } while (next >0) { k[--right_min] = temp[--next]; } } } }
int main(int argc, char* argv[]) { int a[10] = { 2, 5, 6, 8, 2, 3, 9, 1, 8, 0 };
MergeSort(a, 10); for (int i = 0; i < 10; i++) printf("%d ", a[i]);
system("pause"); return 0; }
|
迭代归并排序2: 代码指针存在问题.
#include <stdio.h> #include <stdlib.h>
struct LinkNode { int data; struct LinkNode *next; };
struct LinkNode *init_link() { struct LinkNode *header = malloc(sizeof(struct LinkNode)); header->data = 0; header->next = NULL;
struct LinkNode *p_end = header;
int val = -1; while (1) { scanf("%d", &val); if (val == -1) break;
struct LinkNode *newnode = malloc(sizeof(struct LinkNode)); newnode->data = val; newnode->next = NULL;
p_end->next = newnode; p_end = newnode; } return header; }
int foreach_link(struct LinkNode *header) { if (NULL == header || header->next == NULL) return 0;
while (header->next != NULL) { printf("%d \n", header->data); header = header->next; } return 1; }
void insert_link(struct LinkNode *header,int oldval,int newval) { struct LinkNode *pPrev = header; struct LinkNode *Current = pPrev->next;
if (NULL == header) return;
while (Current != NULL) { if (Current->data == oldval) break;
pPrev = Current; Current = Current->next; }
struct LinkNode *newnode = malloc(sizeof(struct LinkNode)); newnode->data = newval; newnode->next = NULL;
newnode->next = Current; pPrev->next = newnode; }
void clear_link(struct LinkNode *header) { struct LinkNode *Current = header->next;
while (Current != NULL) { struct LinkNode *pNext = Current->next; printf("清空数据: %d \n", Current->data); free(Current); Current = pNext; } header->next = NULL; }
int remove_link(struct LinkNode *header, int delValue) { if (NULL == header) return;
struct LinkNode *pPrev = header; struct LinkNode *Current = pPrev->next;
while (Current != NULL) { if (Current->data == delValue) { pPrev->next = Current->next; free(Current); Current = NULL; } }
pPrev = Current; Current = Current->next; }
void destroy_link(struct LinkNode *header) { if (NULL == header) return;
struct LinkNode *Curent = header; while (Curent != NULL) { struct LinkNode *pNext = Curent->next; free(Curent); Curent = pNext; } }
void reverse_link(struct LinkNode *header) { if (NULL == header) return;
struct LinkNode *pPrev = NULL; struct LinkNode *Current = header->next; struct LinkNode * pNext = NULL;
while (Current != NULL) { pNext = Current->next; Current->next = pPrev; pPrev = Current; Current = pNext; } header->next = pPrev; }
int main(int argc, char* argv[]) {
struct LinkNode * header = init_link();
reverse_link(header); foreach_link(header);
clear_link(header); system("pause"); return 0; }
|
以下代码来源于网络
技巧01:冒泡排序
#include <stdio.h> int main(int argc, char *argv[]) { int i,j,t,a[11]; printf ("please input 10 numbers:\n"); for(i=1;i<11;i++) scanf("%d",&a[i]); for(i=1;i<10;i++) for(j=1;j<11-i;j++) if (a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } printf ("the sorted numbers:\n"); for(i=1;i<=10;i++) printf ("%5d",a[i]); return 0; }
|
技巧02:选择排序
#include <stdio.h> int main(int argc, char *argv[]) { int i,j,t,a[11]; printf ("please input 10 numbers:\n"); for(i=1;i<11;i++) scanf("%d",&a[i]); for(i=1;i<=9;i++) for(j=i+1;j<=10;j++) if (a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } printf ("the sorted numbers:\n"); for(i=1;i<=10;i++) printf ("%5d",a[i]); return 0; }
|
技巧03:直接插入排序
#include <stdio.h> void insort(int s[],int n) { int i,j; for (i=2; i<=n; i++) { s[0]=s[i]; j=i-1; while(s[0]<s[j]) { s[j+1]=s[j]; j--; } s[j+1]=s[0]; } } int main(int argc, char *argv[]) { int a[11],i; printf ("please input number:\n"); for(i=1;i<=10;i++) scanf("%d",&a[i]); printf ("the original order:\n"); for(i=1;i<11;i++) printf ("%5d",a[i]); insort(a,10); printf ("\nthe sorted numbers:\n"); for(i=1;i<11;i++) printf ("%5d",a[i]); return 0; }
|
技巧04:归并排序
#include <stdio.h> void merge(int r[],int s[],int x1,int x2,int x3) { int i,j,k; i=x1; j=x2+1; k=x1; while((i<=x2)&&(j<=x3)) if (r[i]<=r[j]) { s[k]=r[j]; i++; k++; } else { s[k]=r[j]; j++; k++; } while(i<=x2) s[k++]=r[i++]; while(j<=x3) s[k++]=r[j++]; } void merge_sort(int r[],int s[],int m,int n) { int p; int t[20]; if(m==n) s[m]=r[m]; else { p=(m+n)/2; merge_sort(r,t,m,p); merge_sort(r,t,p+1,n); merge(t,s,m,p,n); } } main() { int a[11]; int i; printf ("please input 10 numbers:\n"); for(i=1;i<=10;i++) scanf("%d",&a[i]); merge_sort(a,a,1,10); printf ("the sorted numbers:\n"); for(i=1;i<=10;i++) printf ("%5d",a[i]); return 0; }
|
技巧05:希尔排序(插入排序的改进)
#include <stdio.h> void shsort(int s[],int n) { int i,j,d; d=n/2; while(d>=1) { for (i=d+1; i<=n; i++) { s[0]=s[i]; j=i-d; while((j>0)&&(s[0]<s[j])) { s[j+d]=s[j]; j=j-d; } s[j+d]=s[0]; } d=d/2; } } int main(int argc, char *argv[]) { int a[11],i; printf ("please input numbers:\n"); for(i=1;i<=10;i++) scanf("%d",&a[i]); shsort(a,10); printf ("the sorted numbers:\n"); for(i=1;i<=10;i++) printf ("%5d",a[i]); return 0; }
|
技巧06:快速排序(冒泡排序的改进)
主要的算法思想是在带排序的n个数据中取第一个数据作为基准值,将所有的记录分为3组,使得
第一组中各数据值均小于或等于基准值,第二组便是做基准值的数据,第三组中个数举值均大于
或等于基准值。这便实现了第一趟分隔,然后再对第一组和第三组分别重复上述方法。
#include <stdio.h> void qusort(int s[],int start,int end) { int i,j; i=start; j=end; s[0]=s[start]; while(i<j) { while(i<j&&s[0]<s[j]) j--; if (i<j) { s[i]=s[j]; i++; } while(i<j&&s[i]<=s[0]) i++; if (i<j) { s[j]=s[i]; j--; } } s[i]=s[0]; if(start<i) qusort(s,start,j-1); if(i<end) qusort(s,j+1,end); } int main(int argc, char *argv[]) { int a[11],i; printf ("please input numbers:\n"); for(i=1;i<=10;i++) scanf("%d",&a[i]); qusort(a,1,10); printf ("the sorted numbers:\n"); for(i=1;i<=10;i++) printf ("%5d",a[i]); return 0; }
|
技巧07:顺序查找
#include <stdio.h> void search(int key,int a[],int n) { int i,count = 0,count1=0; for (i=0; i<n; i++) { count++; if (a[i]==key) { printf ("serch %d times a[%d]=%d\n",count,i,key); count1++; } } if(count1==0) printf ("no found!\n"); } int main(int argc, char *argv[]) { int n,key,a[100],i; printf ("please input the length of array:\n"); scanf("%d",&n); printf ("please input element:\n"); for(i=0;i<n;i++) scanf("%d",&a[i]); printf ("please input the number which do you want to search:\n"); scanf("%d",&key); search(key,a,n); return 0; }
|
技巧08:二分查找
#include <stdio.h> void binary_search(int key,int a[],int n) { int low,high,mid,count=0,count1=0; low = 0; high = n-1; while(low<high) { count++; mid=(low+high)/2; if(key<a[mid]) high=mid-1; else if(key>a[mid]) low=mid+1; else if(key==a[mid]) { printf ("success!\nsearch %d times! a[%d]=%d\n",count,mid,key); count1++; break; } } if(count1==0) printf ("no found!\n"); } int main(int argc, char *argv[]) { int i,key,a[100],n; printf ("please input the length of array:\n"); scanf("%d",&n); printf ("please input the element:\n"); for(i=0;i<n;i++) scanf("%d",&a[i]); printf ("please input the number which do you want to serch:\n"); scanf("%d",&key); binary_search(key,a,n); return 0; }
|
技巧09:分块查找
#include <stdio.h> struct index //定义块的结构 { int key; int start; int end; }index_table[4]; int block_search(int key,int a[]) { int i,j; i=1; while(i<=3&&key>index_table[i].key) i++; if(i>3) return 0; j=index_table[i].start; while(j<=index_table[i].end&&a[j]!=key) j++; if(j>index_table[i].end) j=0; return j; } int main(int argc, char *argv[]) { int i,j=0,k,key,a[16]; printf ("please input the number:\n"); for(i=1;i<16;i++) scanf("%d",&a[i]); for (i=1; i<=3; i++) { index_table[i].start=j+1; j=j+1; index_table[i].end=j+4; j=j+4; index_table[i].key=a[j]; } printf ("please inpu the number whick do you want to search:\n"); scanf("%d",&key); k=block_search(key,a); if(k!=0) printf ("success ! the position is :%d\n",k); else printf ("no found!\n"); return 0; }
|
技巧10:哈系查找(没能很好的运行)
#include <stdio.h> #include <time.h> #define Max 11 #define N 8 int hashtable[Max]; int func(int value) { return value % Max; } int search(int key) { int pos,t; pos=func(key); t=pos; while(hashtable[t]!=key && hashtable[t]!=-1) { t=(t+1)%Max; if(pos==t) return -1; } if(hashtable[t]==-1) return 0; else return t; } void creathash(int key) { int pos,t; pos = func(key); t = pos; while(hashtable[t]!=-1) { t=(t+1)%Max; if(pos==t) { printf ("hash table is full\n"); return ; } } hashtable[t]=key; } int main(int argc, char *argv[]) { int flag[50]; int i,j,t; for(i=0;i<Max;i++) hashtable[i]=-1; for(i=0;i<50;i++) flag[i]=0; rand((unsigned long)time(0)); i=0; while(i != N) { t=rand()%50; if (flag[t]=0) { creathash(t); printf ("%2d:\n",t); for (j=0; j < Max; j++) printf ("(%2d) \n",hashtable[j]); printf ("\n"); flag[t]=1; i++; } } printf ("please input number whick do you want to search:\n"); scanf("%d",&t); if (t>0&&t<50) { i=search(t); if(i != -1) printf ("success! the position is:%d\n",i); else printf ("sorry,no found!\n"); } else printf ("input error!\n"); return 0; }
|