(3条消息) 《C语言入门100例》_英雄哪里出来-CSDN博客
(3条消息) 《算法零基础100讲》_英雄哪里出来-CSDN博客
这第一天主要做了一下排序的题放上链接
(3条消息) 【第48题】实现一个冒泡排序_英雄哪里出来-CSDN博客
(3条消息) 【第49题】实现一个简单插入排序_英雄哪里出来-CSDN博客
??????(3条消息) 【第50题】实现一个简单选择排序_英雄哪里出来-CSDN博客
(3条消息) 【第51题】qsort 应用 | 整形数组的排序_英雄哪里出来-CSDN博客
冒泡排序的主要思想就是进行两个相邻元素之间比较大小。
这是一趟冒泡排序,这里一共9个元素,那就是有八个这样的冒泡排序,而一趟随着元素一次一次往前挪动,次数也就减少。所以第一层循环应该是总的排序次数,内层循环就是随着元素的移动次数减少也就是每一趟冒泡排序的次数。
第一个解法通过学习英雄哥的自己能独立写出来
#include<stdio.h>
void swap(int* a, int* b)//(1)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int a[1001];
int main()
{
int i,n,swapped,last;
int a[5] = { 1,2,4,5,3 };//(2)
n = sizeof(a) / sizeof(a[0]);//(3)
last = n;
do {
swapped = 0;
for (i = 0; i < last - 1; i++) {//(4)
if (a[i] > a[i + 1]) {(5)
swap(&a[i], &a[i + 1]);//(6)
swapped = 1;//(7)
}
}
--last;(8)
} while (swapped);
for (i = 0; i < n; i++) {//(9)
if (i)
printf(" ");
printf("%d", a[i]);
}
puts("");
return 0;
}
英雄哥的解法:
(1):这个函数接口主要是进行交换两个元素
(2):创建一个自定义数组
(3):这里的n是数组的大小
(4):一共last个元素,所以排序last-1次
(5):实现升序排列如果前面元素大于后面的元素进行交换
(6):取出要交换的元素地址,实现Swap函数进行交换
(7):如果有两个元素交换就标记一下,最后如果没有元素交换swapped=0则终止循环
(8):每次排序完部分元素,待排序元素就减少。
(9):实现打印第一个元素前面没有空格,从第二个元素开始都会有空格。
第二种方法
void print(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
void Swap(int* n1, int* n2)
{
int tmp = *n1;
*n1 = *n2;
*n2 = tmp;
}
void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
Swap(&arr[j], &arr[j + 1]);
}
}
}
}
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
print(arr, sz);
return 0;
}
这里的插入排序主要思想(按照升序)就是先拿出第二个元素然后与第一个元素比较,如果第二个元素比第一个元素小的话就要进行交换,接着拿出拿出第三个元素与前两个元素比较,比较完之后进行交换,跳出循环后进行插入。
#include<stdio.h>
void print_sort(int a[], int sz)//打印函数
{
int i = 0;
for (i = 0; i < sz; i++) {
printf("%d ", a[i]);
}
}
int main()
{
int a[] = { 17,10,8,29,37,14 };//创建数组
int i, j;
int sz = sizeof(a) / sizeof(a[0]);//计算整个数组的大小
for (i = 1; i < sz; i++) {
, int tmp = a[i];//拿出下标为1的元素(也就是第二个元素)
for (j = i - 1; j >= 0; j--) {//(后一个元素与前面的元素比较)
if (a[j] > tmp) {//如果前面的元素大于后面的元素就进行交换(这里的交换不是真正意义上//的交换,因为等比较元素之后跳出循环要进行插入元素)
a[j + 1] = a[j];//进行交换
}
else {
break;//如果两元素之间符合升序则跳出循环,接着比较下两个元素
}
}
a[j+1] = tmp;//插入元素
}
print_sort(a, sz);
return 0;
}
选择排序就是遍历整个数组然后找出最小的元素放在前面(这里可以看英雄哥的题解和动图)。
#include<stdio.h>
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void change_sort(int a[],int n)
{
int i, j;
for (i = 0; i < n - 1; i++) {
int min = i;//起初记录第一元素的下标为最小下标;
for (j = i + 1; j < n; j++) {
if (a[j] < a[min]) {//待排序时的最小元素
min = j;//进行下标交换(这里的交换不是真正意义上的交换,意思就是这里的j赋给min,min是j,但这里的j还是j(j没有变成min))
}
}
swap(&a[i], &a[min]);//交换两个元素
}
}
int main()
{
int a[] = { 17,10,8,29,37,14 };
int sz = sizeof(a) / sizeof(a[0]);
change_sort(a, sz);
int i = 0;
for (i = 0; i < sz; i++) {
printf("%d ", a[i]);
}
return 0;
- qsort排序整型数组(我这个加了点难度模拟实现qsort在排序)
//模拟实现
void Swap(char* buff1, char* buff2, int width)
{
for (int i = 0; i < width; i++) {
int temp = *buff1;
*buff1 = *buff2;
*buff2 = temp;
buff1++;
buff2++;
}
}
int cmp(const void* pa, const void* pb)
{
return *(int*)pa - *(int*)pb;
}
void bubble_sort(void* base, int sz, int width, int(*cmp)(const void* pa, const void* pb)) {
for (int i = 0; i < sz - 1; i++) {
for (int j = 0; j < sz - 1 - i; j++) {
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0) {
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
//打印
void print1_arr(int arr[], int sz)
{
for (int i = 0; i < sz; i++) {
printf("%d ", arr[i]);
}
}
void test1()
{
int arr[] = { 1,5,6,3,2,8,9,7,4,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz,sizeof(int),cmp);
print1_arr(arr, sz);
}
int main()
{
test1();//模拟实现qsort排序整形
return 0;
}
|