选择排序
特点: 拿到一个元素的值依次和其它元素进行比较, 完全比较完一次之后, 最值出现在第 0 位
- int main(int argc, const char * argv[]) {
- // 已知一个无序的数组, 里面有 5 个元素, 要求对数组进行排序
- int nums[8] = {99, 12, 88, 34, 5, 44, 12, 100};
- int length = sizeof(nums) / sizeof(nums[0]);
- printf("length = %i\n", length);
- for (int i = 0; i <length; i++) {
- printf("nums[%i] = %i\n", i, nums[i]);
- }
- // length - 1 是为了防止角标越界
- // length - 1 因为最后一个元素已经没有可以比较的了
- // 0, 1, 2, 3, 4
- for (int i = 0; i < length - 1; i++) {
- for (int j = i+1; j < length; j++) {
- // printf("*");
- // printf("i = %i, j = %i\n", i, j);
- if (nums[i]> nums[j]) {
- int temp = nums[i];
- nums[i] = nums[j];
- nums[j] = temp;
- }
- }
- // printf("\n");
- }
- printf("--------------\n");
- for (int i = 0; i <length; i++) {
- printf("nums[%i] = %i\n", i, nums[i]);
- }
- return 0;
- }
冒泡排序
- int main(int argc, const char * argv[]) {
- /*
- 思路:
- 1. 先分析如何比较
- 2. 找出比较的规律比较完一次之后第二次比较会少一次
- 3. 打印倒三角
- 4. 打印需要比较的角标
- 5. 比较并交换位置
- 6. 将常量替换为变量 (length)
- */
- // 已知一个无序的数组, 里面有 5 个元素, 要求对数组进行排序
- int nums[6] = {99, 12, 88, 34, 5, 7};
- int length = sizeof(nums) / sizeof(nums[0]);
- for (int i = 0; i < length; i++) {
- printf("nums[%i] = %i\n", i, nums[i]);
- }
- for (int i = 0; i < length - 1; i++) {
- for (int j = 0; j < length - 1 - i; j++) {
- // printf("*");
- // printf("%i == %i\n", j, j+1);
- if (nums[j]> nums[j + 1]) {
- int temp = nums[j];
- nums[j] = nums[j + 1];
- nums[j + 1] = temp;
- }
- }
- // printf("\n");
- }
- printf("----------\n");
- for (int i = 0; i <length; i++) {
- printf("nums[%i] = %i\n", i, nums[i]);
- }
- return 0;
- }
选择 - 冒泡排序优化
- void selectSort(int nums[], int length);
- void printArray(int nums[], int length);
- //void swap(int v1, int v2);
- void swap(int nums[], int i, int j);
- void bubbleSort(int nums[], int length);
- int main(int argc, const char * argv[])
- {
- // 已知一个无序的数组, 里面有 5 个元素, 要求对数组进行排序
- int nums[8] = {99, 12, 88, 34, 5, 44, 12, 100};
- int length = sizeof(nums) / sizeof(nums[0]);
- printArray(nums, length);
- // selectSort(nums, length);
- bubbleSort(nums, length);
- printf("----------------\n");
- printArray(nums, length);
- return 0;
- }
- // 遍历数组
- void printArray(int nums[], int length)
- {
- for (int i = 0; i < length; i++) {
- printf("nums[%i] = %i\n", i, nums[i]);
- }
- }
- void bubbleSort(int nums[], int length)
- {
- for (int i = 0; i < length - 1; i++) {
- for (int j = 0; j < length - 1 - i; j++) {
- if (nums[j]> nums[j + 1]) {
- swap(nums, j, j+1);
- }
- }
- }
- }
- // 选择排序
- void selectSort(int nums[], int length)
- {
- for (int i = 0; i <length - 1; i++) {
- for (int j = i+1; j < length; j++) {
- if (nums[i]> nums[j]) {
- /*
- int temp = nums[i];
- nums[i] = nums[j];
- nums[j] = temp;
- */
- // swap(nums[i], nums[j]);
- swap(nums, i, j);
- }
- }
- }
- }
- // 基本数据类型作为函数的参数, 是值传递, 在函数中修改形参不会影响实参的值
- /*
- void swap(int v1, int v2)
- {
- int temp = v1;
- v1 = v2;
- v2 = temp;
- }
- */
- // 交换两个数的值
- void swap(int nums[], int i, int j)
- {
- int temp = nums[i];
- nums[i] = nums[j];
- nums[j] = temp;
- }
来源: http://www.jianshu.com/p/8f4e5055306e