问题:给定6个数,按从大到小的顺序输出
解决方法:
冒泡排序
代码:
#include <stdio.h> #include <stdlib.h> const int n = 6; void main() { int i,temp,change,j,a[n]; //输入 for(i = 0;i < n;i++) { printf("请输入a[%d]:",i); scanf("%d",&a[i]); } //输出 for(i = 0;i < n;i++) { printf("%d ",a[i]); } printf(" "); //从大到小排序 for(i = 1;i < n ;i++) { change = 0; for(j = 0;j < n - i;j++) // 从前向后比较 { if(a[j] < a[j + 1]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; change = 1; } } if(change = 0) { break; } } //输出 for(i = 0;i < n;i++) { printf("%d ",a[i]); } printf(" "); }
#include <stdio.h> #include <stdlib.h> const int n = 6; void main() { int i,temp,change,j,a[n]; //输入 for(i = 0;i < n;i++) { printf("请输入a[%d]:",i); scanf("%d",&a[i]); } //输出 for(i = 0;i < n;i++) { printf("%d ",a[i]); } printf(" "); //从大到小排序 for(i = 0;i < n - 1;i++) // n-1趟 { change = 0; for(j = n - 1;j > i;j--) // 从后向前比较 n-i 次 { if(a[j] > a[j - 1]) { temp = a[j]; a[j] = a[j - 1]; a[j - 1] = temp; change = 1; } } if(change = 0) { break; } } //输出 for(i = 0;i < n;i++) { printf("%d ",a[i]); } printf(" "); }
快速排序
算法思想:基于分治法:在待排序表L[1...n]中任取一个元素pivot作为基准,通过一趟排序将待排序表化为独立的两部分L[1,,k-1]和L[k+1.....n],使得L[1...k-1]中所有的元素小于pivot,L[k+1....n]中的所有元素大于或等于pivot,则pivot放在了其最终位置L(k)上,而后分别递归得对两个子表左重复操作,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上
代码:
#include <stdio.h> #include <stdlib.h> const int n = 7; //链表划分【当前第一个元素设为pivot】 int partition(int a[],int low,int high) { int pivot = a[low]; //当前第一个元素设为pivot,对表进行划分 while(low < high) { while(low < high && a[high] >= pivot) //将比pivot小的元素移动到左侧 high--; a[low] = a[high]; while(low < high && a[low] <= pivot) //将比pivot大的元素移动到右侧 low++; a[high] = a[low]; } a[low] = pivot; //pivot元素存放到最终位置 return low; //返回存放pivot的最终位置 } //快速排序递归式 void quicksort(int a[],int low,int high) { if(low < high) { int pivotpos = partition(a,low,high); quicksort(a,low,pivotpos - 1); quicksort(a,pivotpos+1,high); } } void main() { int a[] = {1,4,7,8,5,2,3}; int low = 0, high = n - 1,i; quicksort(a,low,high); printf("排序后: "); for(i = 0;i < n;i++) { printf("%d ",a[i]) } }使pivot每次是随机选取
??排序
#include <stdio.h> #include <stdlib.h> const int n = 6; void main() { int i,temp,change,j,a[n]; //输入 for(i = 0;i < n;i++) { printf("请输入a[%d]:",i); scanf("%d",&a[i]); } //输出 for(i = 0;i < n;i++) { printf("%d ",a[i]); } printf(" "); //从大到小排序 for(i = 0;i < n - 1;i++) // n-1趟 { change = 0; for(j = i + 1;j < n;j++) // 从开头起 逐元素比较 { if(a[i] < a[j]) { temp = a[j]; a[j] = a[i]; a[i] = temp; change = 1; } } if(change = 0) { break; } } //输出 for(i = 0;i < n;i++) { printf("%d ",a[i]); } printf(" "); }
简单选择排序
算法思想:假设排序表为L【1....n】,第 i 趟排序即从L【i....n】中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n - 1 趟排序就可以使得整个排序表有序·
#include <stdio.h> #include <stdlib.h> void main() { int a[7] = {1,4,7,8,5,2,3}; // 选择排序 int i,j,min,temp; for(i = 0;i < 6;i++) //一共进行n - 1趟 { min = i; //记录最小元素位置 for(j = i + 1;j < 7;j++) //在a【i....n - 1】中选择最小的元素 { if(a[j] < a[min]) min = j; //更新最小元素位置 } if(min != i) { //与第i个位置交换 temp = a[i]; a[i] = a[min]; a[min] = temp; } } //排序后输出 for(i = 0;i < 7;i++) { printf("%d ",a[i]); } }