1.Bubble Sort (3)
1.1
#include <stdio.h>
int main(void) {
int nums[4] = {1,5,3,2};
//caculate the size of array
size_t size = sizeof(nums) / sizeof(nums[0]);
for (int i = 1; i < size; i++) {
for (int j = 0; j < size - i; j++) {
if (nums[j + 1] < nums[j]) {
//exchange the values by adding an empty container
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
printf("bubble sorted nums[4] = {");
for (int k = 0; k < size; k++) {
printf("%d",nums[k]);
if (k != 3) {
printf(",");
}
}
printf("}\n");
return 0;
}
output:
bubble sorted nums[4] = {1,2,3,5}
1.2 reversed
#include <stdio.h>
int main(void) {
int nums[4] = {1,5,3,2};
size_t size = sizeof(nums) / sizeof(nums[0]);
for (int i = 1; i < size; i++) {
for (int j = 3; j > i - 1; j--) {
if (nums[j] > nums[j - 1]) {
//exchange the values by adding an empty container
int temp = nums[j];
nums[j] = nums[j - 1];
nums[j - 1] = temp;
}
}
}
printf("Reversed bubble sorted nums[4] = {");
for (int k = 0; k < size; k++) {
printf("%d",nums[k]);
if (k != size - 1) {
printf(",");
}
}
printf("}\n");
return 0;
}
output:
Reversed bubble sorted nums[4] = {5,3,2,1}
1.3
#include <stdio.h>
int main(void) {
int nums[] = { 1,5,3,2 };
//caculate the size of array
size_t size = sizeof(nums) / sizeof(nums[0]);
for (int i = 1; i < size; i++) {
for (int j = 0; j < size - i; j++) {
if (nums[j + 1] > nums[j]) {
//exchange the values by adding an empty container
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
printf("2Reversed bubble Sorted nums[4] = {");
for (int k = 0; k < size; k++) {
printf("%d",nums[k]);
if (k != size - 1) {
printf(",");
}
}
printf("}\n");
return 0;
}
output:
2Reversed bubble Sorted nums[4] = {5,3,2,1}
2.Select Sort(3)
2.1 思路很像
#include <stdio.h>
int main(void) {
int nums[4] = {1,5,3,2};
int* pzero = nums;//default:the ptr to nums[0]
size_t size = sizeof(nums) / sizeof(nums[0]);//caculate the array
for (int i = 1; i < size; i++) {
if (nums[i] > *pzero) {
//exchange values by adding a empty container
int temp = *pzero;//save the original value of nums[0]
*pzero = nums[i];
nums[i] = temp;//the original nums[0]
}
}
for (int j = 2; j < size; j++) {
if (nums[j] > *(pzero + 1)) {
//exchange values by adding a empty container
int temp2 = *(pzero + 1);
*(pzero + 1) = nums[j];
nums[j] = temp2;
}
}
for (int k = 3; k < size; k++) {
if (nums[k] > *(pzero + 2)) {
//exchange values by adding a empty container
int temp3 = *(pzero + 2);
*(pzero + 2) = nums[k];
nums[k] = temp3;
}
}
printf("nums[4] = {");
for (int d = 0; d < size; d++) {
printf("%d",nums[d]);
if (d != size - 1) {
printf(",");
}
}
printf("}\n");
return 0;
}
output:
nums[4] = {5,3,2,1}
2.2 改
#include <stdio.h>
int main(void) {
int nums[4] = {1, 5, 3, 2};
int* pzero = nums; // ptr to nums[0]
size_t size = sizeof(nums) / sizeof(nums[0]); // calculate array size
// loop through each position to place the correct element
for (int i = 0; i < size - 1; i++) {
for (int j = i + 1; j < size; j++) {
if (nums[j] > *(pzero + i)) {
// swap values using an empty container
int temp = *(pzero + i);
*(pzero + i) = nums[j];
nums[j] = temp;
}
}
}
// output the sorted array
printf("Sorted nums[4] = {");
for (int d = 0; d < size; d++) {
printf("%d", nums[d]);
if (d != size - 1) {
printf(",");
}
}
printf("}\n");
return 0;
}
output:
Sorted nums[4] = {5,3,2,1}
2.3 minIndex
#include <stdio.h>
int main(void) {
int nums[4] = { 1,5,3,2 };
size_t size = sizeof(nums) / sizeof(nums[0]);
for (int i = 0; i < size - 1; i++) {
//set the minindex []
int min = i;
for (int j = i + 1; j < size; j++) {
if (nums[j] < nums[min]) {
min = j;
}
}
//exchange current value with the min value
if (min != i) {
int temp = nums[i];
//exchange the values
nums[i] = nums[min];
nums[min] = temp;
}
}
printf(" Sorted nums[4] = {");
for (int k = 0; k < size; k++) {
printf("%d", nums[k]);
if (k != size - 1) {
printf(",");
}
}
printf("}");
}
output:
Sorted nums[4] = {1,2,3,5}
3.错误写法
当nums[4] ={ 1,5,3,2}时,排序正常,错误不明显,再增加数字之后:
#include <stdio.h>
int main(void) {
int nums[7] = { 1,5,3,2,10,11,12};
int* pzero = nums;//default: the ptr to nums[0]
size_t size = sizeof(nums) / sizeof(nums[0]);
for (int i = 1; i < size; i++) {
for (int j = i - 1; j < size - 1; j++) {
if (nums[j + 1] > *(pzero + j)) {
//exchange the values by adding a empty comtainer
int temp = *(pzero + j);
*(pzero + j) = nums[j + 1];
nums[j + 1] = temp;
}
}
}
printf("nums[7] = {");
for (int k = 0; k < size; k++) {
printf("%d", nums[k]);
if (k != size - 1) {
printf(",");
}
}
printf("}");
return 0;
}
output:
nums[7] = {5,3,11,12,10,2,1}
分析:
1.只比较了静态小区间里的最大值,而不是全局的最大值
2.内循环的起始值不合理
3.未排序和排序的部分界限不明,或者说根本没有全局排序,只是部分排序
4.总结
综上:排序只是一种思想,没有固定的写法,写法也只是实现思想的工具。