长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap 请设计并实现排序

长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap 请设计并实现排序。
google笔试小题。题目来源: http://wenku.baidu.com/view/5aa818dda58da0116c17498b.html

休闲小题。
2个key
一个是只能与0 swap,另一个是数组的下标和值是一一对应的。
第二个容易被忽略。所以读到一个元素时,如果值和下标不等,那么可以直接把这个元素的值放到正确位置上去,目标位置的值挪回来。当然这个过程要借助元素0来完成。

假设输入是 2,0,3,1
step 1
遍历数组,找出值为0的元素,和num[0]交换
0 2 3 1

step 2
如果num[1]下标和值匹配,考虑下一个,否则
尝试把num[1]的值借助num[0]放入正确的位置
3 2 0 1 --》  3 0 2 1 --》 0 3 2 1

step 3
重复 step 2,直到 num[1]正确被放置了 1

step 4
num[1]处理完,step2处理下一个元素num[2],直到所有元素的位置和值都匹配



  1. void swap(int* num, int a, int b){
  2.     if(== b) return;
  3.     int tmp = num[a];
  4.     num[a] = num[b];
  5.     num[b] = tmp;    
  6. }

  7. void sort(int* num, int size){
  8.     int i = 0;
  9.     //move 0 to num[0]
  10.     for(;i<size;i++){
  11.         if(num[i] == 0){
  12.             swap(num, i, 0);
  13.            }
  14.         }
  15.         i = 1;
  16.         while(i<size){
  17.         //postion matched value
  18.           if(num[i] == i){
  19.              i++;
  20.         }
  21.         //postion mismatch value, then need to place value to the correct postition and continue
  22.         else{
  23.             int tarpos = num[i];
  24.             swap(num, 0, tarpos); // num[tarpos] = 0
  25.             swap(num, tarpos,i); // num[i] = 0
  26.             swap(num, 0, i); // num[0] = 0
  27.         }
  28.     }
  29. }

  30. int main(){
  31.     int input[] = {2,0,3,1};
  32.     sort(input, 4);
  33.     int t = 0;
  34.     for(;t<4;t++)
  35.         printf("%d->",input[t]);
  36.     printf("n");
  37. }
在C语言中,快速排序是一种常用的、高效的排序算法,其基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分继续进行排序,直到整个序列有序。 以下是快速排序的基本步骤和一个简单的递归实现: 1. **选择基准元素**:通常选择第一个元素作为基准值(pivot)。 2. **分区操作**:将数组划分为两个区域,所有小于基准的元素放在左边,大于等于基准的元素放在右边。这一步通常通过一趟从左到右的扫描完成。 3. **递归排序**:对左右两个子数组递归地应用快速排序,直到子数组只剩下一个元素或为空。 **快速排序实现(递归版)**: ```c #include <stdio.h> void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } int partition (int arr[], int low, int high) { int pivot = arr[high]; // 选择最后一个元素作为基准 int i = (low - 1); // Index of smaller element for (int j = low; j <= high - 1; j++) { if (arr[j] < pivot) { i++; // Increment index of smaller element swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); // Swap pivot with the correct position return (i + 1); } void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); // Sort elements before pivot quickSort(arr, pi + 1, high); // Sort elements after pivot } } // 测试函 void printArray(int arr[], int size) { int i; for (i = 0; i < size; i++) printf("%d ", arr[i]); printf("\n"); } int main() { int data[] = {9, 7, 5, 11, 12, 2, 14, 3}; int n = sizeof(data) / sizeof(data[0]); quickSort(data, 0, n - 1); printf("Sorted array: \n"); printArray(data, n); return 0; } ``` 当你运行这个程序,它会对给定的整数组进行快速排序并打印出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值