博主还是萌新,不足之处请多多指正
排序算法
一、选择排序
思想:每次选择数组中的最大值(最小值)元素,将其与前面未排序数组元素进行互换。
算法:
#include<stdio.h>
int main(void){
int i, j;
int a[10];
int temp, ipos;
int n;
/*赋值*/
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
/*从大到小排序*/
for(i = 0; i < n; i++){
temp = a[i]; //设当前元素为最大值
ipos = i; //获取当前元素位置
for(j = i+1; j < n; j++){ //遍历比较大小
if(a[j] > temp){
temp = a[j];
ipos = j;
}
}
a[ipos] = a[i];//较换
a[i] = temp;
}
/*遍历输出*/
for(i = 0; i < n; i++){
if(i == n-1){
printf("%d", a[i]);
}else{
printf("%d ", a[i]);
}
}
return 0;
}
运行结果:
二、冒泡排序
思想:每次比较数组中相邻两个元素的值将较大(或较小)的元素放在前面。
算法:
#include<stdio.h>
int main(void){
int i, j;
int a[10];
int temp;
int n;
/*赋值*/
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
/*从大到小排序*/
for(i = 0; i < n; i++){
for(j = n-1; j > i; j--){
if(a[j] > a[j-1]){//遍历比较大小
temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
}
/*遍历输出*/
for(i = 0; i < n; i++){
if(i == n - 1){
printf("%d", a[i]);
}else{
printf("%d ", a[i]);
}
}
return 0;
}
运行结果:
三、交换排序
思想:将数组中每一位元素与其后的所有元素一一比较,根据条件进行互换。
算法:
#include<stdio.h>
int main(void){
int i, j;
int a[10];
int temp;
int n;
/*赋值*/
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
/*从大到小排序*/
for(i = 0; i < n; i++){
for(j = i+1; j < n; j++){
if(a[j] < a[i]){//遍历比较大小
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
/*遍历输出*/
for(i = 0; i < n; i++){
if(i == n - 1){
printf("%d", a[i]);
}else{
printf("%d ", a[i]);
}
}
return 0;
}
运行结果:
四、插入排序
思想:在数组中抽出一个元素,在前面的元素中寻找相应的位置插入。
算法:
#include<stdio.h>
int main(void){
int i, j;
int a[10];
int temp, ipos;
int n;
/*赋值*/
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
/*从大到小排序*/
for(i = 0; i < n; i++){
temp = a[i]; //选择要插入的元素
ipos = i - 1;
while((ipos >= 0) && (temp < a[ipos])){//寻找插入位置并插入
a[ipos+1] = a[ipos];
ipos--;
}
a[ipos+1] = temp;
}
/*遍历输出*/
for(i = 0; i < n; i++){
if(i == n - 1){
printf("%d", a[i]);
}else{
printf("%d ", a[i]);
}
}
return 0;
}
运行结果:
五、快速排序
思想:先选择一个基准值,然后把比基准值小的放一边,比基准值大的放另一边。最后对两边分别递归,重复这个过程。
注:基准值一般选择中间值
算法:
#include<stdio.h>
void CelerityRun(int left, int right, int array[]);
int main(void){
int i, j;
int a[10];
int temp, ipos;
int n;
/*赋值*/
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
/*从大到小排序*/
CelerityRun(0, n-1, a);
/*遍历输出*/
for(i = 0; i < n; i++){
if(i == n - 1){
printf("%d", a[i]);
}else{
printf("%d ", a[i]);
}
}
return 0;
}
void CelerityRun(int left, int right, int array[]){
int i, j;
int middle, temp;
i = left;
j = right;
middle = array[(left+right) / 2]; //基准数
do{
while((array[i] > middle) && (i < right)){ //从左边找小于基准数的元素
i++;
}
while((array[j] < middle) && (j > left)){ //从右边找大于基准数的元素
j--;
}
if(i <= j){
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
} while (i <= j);//两下标交错时停止
/*对左右半边分别递归操作*/
if(left < j){
CelerityRun(left, j, array);
}
if(right > i){
CelerityRun(i, right, array);
}
}
运行结果: